web-dev-qa-db-fra.com

Comment ajouter un widget par programme à un site nouvellement créé (WPMU) dans un plugin?

Je crée un plugin qui crée de nouveaux sites (WPMU) et qui possède également son propre widget qui doit être placé sur les nouveaux sites qu'il crée.

Le problème que je rencontre est que je ne parviens pas à insérer le plug-in (de préférence, j'aimerais qu'il remplace tous les widgets par le mien uniquement) dans le site nouvellement créé. Il le fait à moitié, en ce sens qu'il place le plug-in dans un état "inactif", au lieu d'être dans la barre latérale.

Voici le code que j'ai:

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');

J'ai aussi ceci pour enregistrer (et désinscrire) les widgets:

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

Il semble que la réponse soit beaucoup plus simple que je ne le pensais. J'ai donc pensé partager la réponse avec ceux qui tombent sur ce problème également.

De toute évidence, il me manquait quelque chose dans la base de données qui était nécessaire, aussi je fais un dump SQL de la base de données avant et après avoir fait glisser un widget. Puis comparé les changements survenus. Cela m'a aidé à analyser ce qui devait être mis en place. Le résultat était que je ne mettais pas correctement les paramètres de mon widget. En termes simples, j'ajoutais

Array
(
    [title] => Policies
)

Quand WordPress attendait:

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

Donc, mon code ressemblait plus à ceci:

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');

Pour expliquer quelques informations, notez que, dans le tableau, la première partie est [2], il s’agit du numéro d’instance du widget. En effet, les widgets peuvent être ajoutés plusieurs fois. Par conséquent, si vous souhaitez en avoir plusieurs, vous pouvez en créer un. le tableau en incrémentant à partir du nombre 2. Cela pourrait fonctionner en lui donnant le nombre 1, mais 2 semble être le meilleur numéro de départ pour une raison quelconque (c'est le numéro qui est attribué en premier lors de la création d'un nouveau site multisite pour les widgets par défaut, et lorsque vous faites glisser et déposez).

[_multiwidget] Je ne l'ai pas bien compris, mais je suppose que c'est parce que je crée un plugin qui fonctionne sur wpmu. Le widget est donc autorisé à être vu sur des environnements multisites (corrigez-moi si je me trompe).

2
hazrpg