wp_options
テーブルに保存されているウィジェットインスタンスについて興味深い質問があります。私はそれを理解するまで私はかなりの時間を費やしましたが、それでもなぜそれが起こっているのか知りません。
問題:
だから問題は、私のアドミンダッシュボードでウィジェットをドラッグしてサイドバーにドロップすると、そのIDは2から始まることです。たとえば、テキストウィジェットをドロップすると、そのIDはwidget_text-2
です。もっと面白いことに、wp_options
テーブルに行き、widget_text
オプションからシリアライズされたデータをアンシリアライズすると、2から始まるインデックスを持つ配列が得られます。どうして?
why部分はチケット #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.
)
text-1
idの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(),
でリストされているとき、 next_widget_id_number()
関数は次のウィジェットID番号を計算するために使われます。それは次のように定義されています。
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
IDの場合、次のウィジェットID番号はmax( 1, 1 ) + 1 = 2
です。
そのため、最初のmultiTextウィジェットを利用可能なサイドバーの上にドラッグすると、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
部分とsidebars_widgets
オプションにtext_2
インスタンスが含まれることに気付くでしょう。
それが役に立てば幸い。