Индексы экземпляров виджетов начинаются с «2» в таблице «wp_options»

У меня есть интересный вопрос о экземплярах виджета, сохраненных в таблице wp_options . Я потратил довольно много времени, пока не понял, но все еще не знаю, почему это происходит.

Проблема:
Поэтому проблема заключается в том, что когда я перетаскиваю любой виджет и переношу его на любую боковую панель в панели управления администратора, его идентификатор начинается с 2. Например, когда я отбрасываю текстовый виджет, его идентификатор – widget_text-2 несмотря на то, что это первый виджет. Что еще более интересно, когда я wp_options таблице wp_options и несериализует сериализованные данные из опции widget_text , то я получаю массив с индексами, начиная с 2 . Зачем?

Solutions Collecting From Web of "Индексы экземпляров виджетов начинаются с «2» в таблице «wp_options»"

Какую часть можно найти в билете № 24889 .

Позвольте мне привести @azaozz:

Когда была введена поддержка многопользовательских виджетах, многие виджеты в одно и то же время преобразовывались из «одного» в «мульти». Чтобы сохранить обратную совместимость и не нарушить существующие виджеты, появился код конверсии, который бы установил «одиночные» экземпляры виджета на *-1 (не уверен, почему не *-0 , это было давно). Чтобы не перезаписывать преобразованные данные, новые экземпляры нескольких виджета должны были начинать с формы 2 . Как упоминает @tyxla, это ничего не сломает, а если изменено на -0 или -1 , теоретически все же можно перезаписать чьи-то отдельные виджеты.

Доступный текстовый виджет указан в глобальном $wp_registered_widgets как:

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

Я думаю, что 1, в идентификаторе text-1 , происходит из этой части 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(); } 

Когда доступные wp_list_widgets(), перечислены с помощью wp_list_widgets(), next_widget_id_number() используется для вычисления следующего идентификатора идентификатора виджета . Он определяется как:

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

Для идентификатора text-1 следующий номер идентификатора виджета – max( 1, 1 ) + 1 = 2 .

Поэтому, когда мы перетаскиваем первый виджет « widget_text поверх доступной боковой панели, параметр widget_text сохраняется как (скорректированный для лучшей читаемости):

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

где мы замечаем, что часть i:2 и опция text_2 будут содержать экземпляр text_2 .

Надеюсь, поможет.