web-dev-qa-db-fra.com

Les index des instances de widgets commencent par '2' dans la table 'wp_options'


J'ai une question intéressante à propos des instances de widgets enregistrées dans la table wp_options. J'ai passé pas mal de temps jusqu'à ce que je l'aie compris, mais je ne sais toujours pas pourquoi cela se produit.

Problème:
Le problème est donc que lorsque je déplace un widget et le dépose sur une barre latérale de mon tableau de bord administrateur, son identifiant commence par 2. Par exemple, lorsque je supprime un widget Texte, son identifiant est widget_text-2 malgré le fait qu'il s'agisse du premier widget. Ce qui est plus intéressant, quand je vais à la table wp_options et que je désérialise les données sérialisées à partir de l'option widget_text, ce que je reçois est un tableau avec des index commençant par 2 . Pourquoi?

5
Sebastian Kaczmarek

La partie pourquoi se trouve dans ticket # 24889 .

Me laisser citer @azaozz:

Lorsque la prise en charge des widgets multi-usage a été introduite, un grand nombre de widgets ont été convertis de "simple" en "multi" en même temps. Pour conserver la compatibilité ascendante et ne pas casser les widgets existants, il existait un code de conversion qui définissait les instances "uniques" de widgets sur *-1 (vous ne savez pas pourquoi *-0, il y a longtemps). Afin de ne pas écraser les données converties, les nouvelles instances multi-widgets devaient démarrer à partir du formulaire 2. Comme @tyxla le mentionne, cela ne casse rien et si vous passez à -0 ou -1, vous pouvez en théorie écraser les widgets uniques de quelqu'un.

Le widget Texte disponible est répertorié dans le $wp_registered_widgets global comme suit:

[text-1] => Array
    (
        [name] => Text
        [id] => text-1
        [callback] => Array
            (
                [0] => WP_Widget_Text Object
                    (
                        [id_base] => text
                        [name] => Text
                        [option_name] => widget_text
                        [alt_option_name] => 
                        [widget_options] => Array
                            (
                                [classname] => widget_text
                                [customize_selective_refresh] => 1
                                [description] => Arbitrary text or HTML.
                            )

                        [control_options] => Array
                            (
                                [id_base] => text
                                [width] => 400
                                [height] => 350
                            )

                        [number] => 1
                        [id] => text-1
                        [updated] => 
                    )

                [1] => display_callback
            )

        [params] => Array
            (
                [0] => Array
                    (
                        [number] => -1
                    )

            )

        [classname] => widget_text
        [customize_selective_refresh] => 1
        [description] => Arbitrary text or HTML.
    )

Je pense que le 1, dans le text-1 id, provient de cette partie de WP_Widget::_register() :

if ( $empty ) {
    // If there are none, we register the widget's existence with a generic template.
    $this->_set( 1 );
    $this->_register_one();
}

Lorsque les multiples widgets disponibles sont répertoriés avec wp_list_widgets(),, la fonction next_widget_id_number() est utilisée pour calculer le numéro d’identifiant suivant . Il est défini comme:

function next_widget_id_number( $id_base ) {
    global $wp_registered_widgets;
    $number = 1;

    foreach ( $wp_registered_widgets as $widget_id => $widget ) {
        if ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) )
            $number = max($number, $matches[1]);
    }
    $number++;

    return $number;
}

Pour l'identifiant text-1, le numéro d'identifiant suivant du widget est max( 1, 1 ) + 1 = 2.

Ainsi, lorsque nous faisons glisser le premier widget multi Texte sur une barre latérale disponible, l'option widget_text est stockée sous la forme (modifiée pour une meilleure lisibilité):

a:2:{
i:2;a:3:{s:5:"title";s:0:"";s:4:"text";s:0:"";s:6:"filter";b:0;}s:12:"_multiwidget";i:1;
}

où nous remarquons la partie i:2 et l'option sidebars_widgets contiendra l'instance text_2.

J'espère que ça aide.

6
birgire