it-swarm.com.de

Indizes von Widgets-Instanzen beginnen mit '2' in der Tabelle 'wp_options'


Ich habe interessante Fragen zu Widget-Instanzen, die in der Tabelle wp_options gespeichert sind. Ich habe ziemlich viel Zeit damit verbracht, bis ich es herausgefunden habe, weiß aber immer noch nicht, warum es passiert.

Problem:
Das Problem ist also, dass wenn ich ein Widget auf eine Seitenleiste in meinem Admin-Dashboard ziehe und dort ablege, die ID mit 2 beginnt. Wenn ich beispielsweise ein Text-Widget ablege, lautet die ID widget_text-2, obwohl es sich um das erste Widget handelt. Was interessanter ist, wenn ich zur wp_options-Tabelle gehe und serialisierte Daten aus der widget_text-Option unserialisiere, erhalte ich ein Array mit Indizes, die mit 2 beginnen. Warum?

5

DerwhyTeil befindet sich im Ticket # 24889 .

Lassen Sie mich zitieren @azaozz:

Als die Unterstützung für Mehrzweck-Widgets eingeführt wurde, wurden viele Widgets gleichzeitig von "single" in "multi" konvertiert. Um die Abwärtskompatibilität zu gewährleisten und die vorhandenen Widgets nicht zu beschädigen, gab es einen Konvertierungscode, mit dem die "einzelnen" Widgets-Instanzen auf *-1 gesetzt wurden (nicht sicher, warum nicht *-0, das ist lange her). Um die konvertierten Daten nicht zu überschreiben, mussten die neuen Multi-Widgets-Instanzen das Formular 2 starten. Wie in @tyxla erwähnt, funktioniert dies nicht und wenn es in -0 oder -1 geändert wird, kann es theoretisch immer noch die einzelnen Widgets von jemandem überschreiben.

Das verfügbare Text Widget ist im globalen $wp_registered_widgets aufgelistet als:

[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.
    )

Ich denke, die 1 in der text-1-ID stammt aus diesem Teil der 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();
}

Wenn die verfügbaren Multi-Widgets mit wp_list_widgets(), aufgelistet sind, wird die Funktion next_widget_id_number() verwendet, um die nächste Widget-ID-Nummer zu berechnen. Es ist definiert als:

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;
}

Für die text-1-ID lautet die nächste Widget-ID max( 1, 1 ) + 1 = 2.

Wenn wir also das erste Multi Text Widget über eine verfügbare Seitenleiste ziehen, wird die Option widget_text gespeichert als (zur besseren Lesbarkeit angepasst):

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;
}

wo wir den Teil i:2 und die Option sidebars_widgets bemerken, wird die Instanz text_2 enthalten.

Ich hoffe es hilft.

6
birgire