web-dev-qa-db-ja.com

プラグイン内で新しく作成されたサイト(WPMU)にプログラムでウィジェットを追加するにはどうすればいいですか?

私は新しいサイトを作成するプラグインを作成しています(WPMU)、そしてそれが作成する新しいサイトに配置する必要がある独自のウィジェットも持っています。

私が抱えている問題は、私が新しく作成したサイトにプラグインを挿入することができないということです(私のものにすべてのウィジェットを置き換えることを望みます)。サイドバーではなく、プラグインを「非アクティブ」状態にするという意味で、半分になります。

これが私が持っているコードです:

function se160609($blog_id, $user_id, $domain, $path, $site_id, $meta) {
    switch_to_blog($blog_id);

    switch_theme("twentytwelve");

    register_sidebar(
        array (  
            'name'          => 'Main Sidebar',
            'id'            => 'sidebar-1',
            'before_widget' => '',
            'after_widget'  => '',
            'before_title'  => '',
            'after_title'   => '',
        )
    );

    update_option('widget_mywidget',
        array(
            'title' => 'Policies'
        )
    );

    update_option('sidebars_widgets',
        array(
             'sidebar-1' => array('mywidget')
        )
    );

    restore_current_blog();
}

add_action('wpmu_new_blog', 'se160609');

ウィジェットを登録(および登録解除)するためにもこれがあります。

function se160609_load_widget() {
    register_widget( 'MyWidget' );

    unregister_widget( 'WP_Widget_Archives' );
    unregister_widget( 'WP_Widget_Calendar' );
    unregister_widget( 'WP_Widget_Categories' );
    unregister_widget( 'WP_Widget_Links' );
    unregister_widget( 'WP_Widget_Meta' );
    unregister_widget( 'WP_Widget_Pages' );
    unregister_widget( 'WP_Widget_Recent_Comments' );
    unregister_widget( 'WP_Widget_Recent_Posts' );
    unregister_widget( 'WP_Widget_RSS' );
    unregister_widget( 'WP_Widget_Search' );
    unregister_widget( 'WP_Widget_Tag_Cloud' );
    unregister_widget( 'WP_Widget_Text' );
}
add_action( 'widgets_init', 'se160609_load_widget' );
3
hazrpg

答えは私が思っていたよりもずっと簡単だったように思われるので、私はこの問題にも出会った人たちにも答えを分かち合うと思いました。

データベースに必要なものが欠けていたのは明らかなので、ウィジェットをドラッグする前後のデータベースのSQLダンプもありました。それから、起こった変化を比較しました。これは私が何を入れる必要があるのか​​分析するのを助けました。結果は私が私のウィジェット設定を正しく入れていなかったということでした。簡単に言えば

Array
(
    [title] => Policies
)

WordPressが期待していたとき:

Array
(
    [2] => Array
        (
            [title] => Policies
            [_multiwidget] => 1
        )
)

だから私のコードはもっとこんな感じになりました:

function se160609($blog_id, $user_id, $domain, $path, $site_id, $meta) {
    // Switch the newly created blog.
    switch_to_blog($blog_id);

        // Change to a different theme.
        switch_theme("twentytwelve");

        // Add WordPress options that the widget needs.
        $widget_mywidget = array();
        $widget_mywidget[2]['title'] = "Policies";
        $widget_mywidget[2]['_multiwidget'] = 1;
        update_option( 'widget_mywidget', $widget_mywidget );

        // Add WordPress options to override the default widgets.
        $sidebar_widgets = get_option( 'sidebars_widgets' );
        $sidebar_widgets['sidebar-1'] =  array('mywidget-2');
        update_option( 'sidebars_widgets', $sidebar_widgets );

    // Restore the current blog.
    restore_current_blog();
}
add_action('wpmu_new_blog', 'se160609');

ここで数ビットの情報を説明すると、配列の最初の部分は[2]です。これはウィジェットのインスタンス番号です - ウィジェットは複数回追加できるので、複数のものを作成したい場合は基本的にビルドできますそれはそれを数1を与えることによって動作するかもしれませんが、2は何らかの理由で最も良い開始数であるように思われます(それはデフォルトウィジェットのための新しいマルチサイトサイトを作成するとき最初に割り当てられる数ドラッグアンドドロップしたとき).

[_multiwidget]私は完全には理解していませんでしたが、私はwpmu上で動作するプラグインを作っているためだと思います。そのため、これはマルチサイト環境で見られるようにウィジェットを設定します。

2
hazrpg