質問: プログラムでサイドバーにウィジェットを追加する 私が手に入れた2つのサイドバーにプログラムでウィジェットを追加したいと思います。公式なやり方が見つからなかったのですか?データベースを調べ始めました。私はそれがウィジェットをサイドバーに置く 'sidebars_widgets'オプションであることを発見しました。オプションを見ると、ウィジェット名の末尾にwidget_name-6のように番号が追加されています。その数はどこから来たのでしょうか。これを修正する方法についての任意のアイデア?
回答: 私がこの答えを始めたとき、それはちょっとしたメモであるべきです。まあ、私は失敗しました。ごめんなさい!私と一緒に、深く隠された良いものがあります...wordpressウィジェットの保存方法ウィジェットのリストは'sidebars_widgets'という名前のオプションに格納されています。 var_export()は次のようになります。array ( 'wp_inactive_widgets' => array ( ), 'top-widget' => array ( ), 'bottom-widget' => array ( ), 'array_version' => 3, ) 'wp_inactive_widgets'と'array_version'を無視してください。気にする必要はありません。 他のキーは登録されたサイドバーの識別子です。この場合、サイドバーは次のコードで登録されている可能性があります。// register two sidebars. $sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' ); foreach ( $sidebars as $sidebar ) { register_sidebar( array ( 'name' => $sidebar, 'id' => $sidebar, 'before_widget' => '', 'after_widget' => '' ) ); } デフォルトでは、登録後のサイドバーは空です。 もちろん。登録されたウィジェットクラスごとに、必要なすべてのオプションを含む個別のオプションが作成されます。オプションの前には文字列widget_が付いています。すべてのアクティブなrssウィジェットのオプションを取得するには、調べなければなりません...get_option( 'widget_rss' ); 可能な出力:array ( 2 => array ( 'title' => 'wordpress stack exchange', 'url' => 'http://wordpress.stackexchange.com/feeds', 'link' => 'http://wordpress.stackexchange.com/questions', 'items' => 5, 'show_summary' => 1, 'show_author' => 0, 'show_date' => 0, ), ) 2 の数に注意してください。複数のインスタンスの引数はすべて、この1つのオプションに番号順に格納されています。どのウィジェットクラスがすでにwordpressに認識されているかを確認するには、wp-admin/options.phpに移動し、次のような表示になるまで下にスクロールします。はい、データをシリアル化しました。いいえ、読めません。心配しないでください、あなたはする必要はありません。デモウィジェット内部の仕組みをよりよく説明するために、非常に単純なデモウィジェットを書きました。/** * super simple widget. */ class t5_demo_widget extends wp_widget { public function __construct() { // id_base , visible name parent::__construct( 't5_demo_widget', 't5 demo widget' ); } public function widget( $args, $instance ) { echo $args['before_widget'], wpautop( $instance['text'] ), $args['after_widget']; } public function form( $instance ) { $text = isset ( $instance['text'] ) ? esc_textarea( $instance['text'] ) : ''; printf( '<textarea class="widefat" rows="7" cols="20" id="%1$s" name="%2$s">%3$s</textarea>', $this->get_field_id( 'text' ), $this->get_field_name( 'text' ), $text ); } } コンストラクタに注意してください。't5_demo_widget'は、このウィジェットの識別子である$id_baseです。スクリーンショットでわかるように、その引数はオプションwidget_t5_demo_widgetに格納されています。すべてのカスタムウィジェットはこのように扱われます。名前を推測する必要はありません。そしてyouがあなたのウィジェットを書いたので(おそらく)あなたはあなたのクラスの$instanceパラメータからのすべての引数を知っています。テーマの基本まずサイドバーとカスタムウィジェットを登録する必要があります。これに対する適切な処置は覚えやすいです:'widgets_init'。すべてをコンテナーに入れる - クラスか関数。簡単にするために、t5_default_widget_demo()という名前の関数を使用します。以下のコードはすべてfunctions.phpに入ります。クラスt5_demo_widgetはすでにロードされているはずです。私はそれを同じファイルに入れるだけです...add_action( 'widgets_init', 't5_default_widget_demo' ); function t5_default_widget_demo() { // register our own widget. register_widget( 't5_demo_widget' ); // register two sidebars. $sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' ); foreach ( $sidebars as $sidebar ) { register_sidebar( array ( 'name' => $sidebar, 'id' => $sidebar, 'before_widget' => '', 'after_widget' => '' ) ); } これまでのところ、とても単純です。私たちのテーマはwidget ready、です。デモ用ウィジェットは既知です。今楽しいです。$active_widgets = get_option( 'sidebars_widgets' ); if ( ! empty ( $active_widgets[ $sidebars['a'] ] ) or ! empty ( $active_widgets[ $sidebars['b'] ] ) ) { // okay, no fun anymore. there is already some content. return; } あなたは本当にユーザー設定を破壊したくありません。サイドバーにすでにコンテンツが含まれている場合は、それを超えてコードを実行しないでください。だからこそ私たちはこの場合をやめます。さて、サイドバーが空だとしたら...カウンターが必要です。$counter = 1; ウィジェットは番号付きです。これらの番号はwordpressの2番目の識別子です。それを変更するために配列を取得しましょう:$active_widgets = get_option( 'sidebars_widgets' ); 私たちもカウンターが必要です(後で詳しく説明します)。$counter = 1; そして、これが私たちがどのようにカウンタ、サイドバー名とウィジェット引数を使うかです(まあ、私たちはただ一つの引数を持っています:text)。// add a 'demo' widget to the top sidebar ... $active_widgets[ $sidebars['a'] ][0] = 't5_demo_widget-' . $counter; // ... and write some text into it: $demo_widget_content[ $counter ] = array ( 'text' => "this works!\n\namazing!" ); $counter++; ウィジェットidの作成方法に注意してください。id_base、マイナスの-、およびカウンター。ウィジェットの content は別の変数$demo_widget_contentに格納されています。これは key というカウンターで、ウィジェットの引数は配列に格納されています。衝突を避けるために完了したら、カウンタを1つ増やします。それは簡単でした。今rssウィジェット。より多くの分野、より楽しい!$active_widgets[ $sidebars['a'] ][] = 'rss-' . $counter; // the latest 15 questions from wordpress stack exchange. $rss_content[ $counter ] = array ( 'title' => 'wordpress stack exchange', 'url' => 'http://wordpress.stackexchange.com/feeds', 'link' => 'http://wordpress.stackexchange.com/questions', 'items' => 15, 'show_summary' => 0, 'show_author' => 1, 'show_date' => 1, ); update_option( 'widget_rss', $rss_content ); $counter++; update_option()これはrssウィジェットの引数を別のオプションに格納します。 wordpressは後でこれらを自動的に見つけます。 デモウィジェットの引数を保存しませんでした。今度は2番目のインスタンスを2番目のサイドバーに追加します...// okay, now to our second sidebar. we make it short. $active_widgets[ $sidebars['b'] ][] = 't5_demo_widget-' . $counter; #$demo_widget_content = get_option( 'widget_t5_demo_widget', array() ); $demo_widget_content[ $counter ] = array ( 'text' => 'the second instance of our amazing demo widget.' ); update_option( 'widget_t5_demo_widget', $demo_widget_content ); ...そしてt5_demo_widgetのすべての引数を1つのrushに保存します。同じオプションを2回更新する必要はありません。さて、今日のための十分なウィジェット、sidebars_widgetsも保存しましょう:update_option( 'sidebars_widgets', $active_widgets ); これでwordpressはいくつかの登録済みウィジェットがあることと、各ウィジェットの引数がどこに格納されているかを知るようになります。 sidebar_widgetsのvar_export()は次のようになります。array ( 'wp_inactive_widgets' => array ( ), 'top-widget' => array ( 0 => 't5_demo_widget-1', 1 => 'rss-2', ), 'bottom-widget' => array ( 0 => 't5_demo_widget-3', ), 'array_version' => 3, ) 完全 コード 再び:add_action( 'widgets_init', 't5_default_widget_demo' ); function t5_default_widget_demo() { // register our own widget. register_widget( 't5_demo_widget' ); // register two sidebars. $sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' ); foreach ( $sidebars as $sidebar ) { register_sidebar( array ( 'name' => $sidebar, 'id' => $sidebar, 'before_widget' => '', 'after_widget' => '' ) ); } // okay, now the funny part. // we don't want to undo user changes, so we look for changes first. $active_widgets = get_option( 'sidebars_widgets' ); if ( ! empty ( $active_widgets[ $sidebars['a'] ] ) or ! empty ( $active_widgets[ $sidebars['b'] ] ) ) { // okay, no fun anymore. there is already some content. return; } // the sidebars are empty, let's put something into them. // how about a rss widget and two instances of our demo widget? // note that widgets are numbered. we need a counter: $counter = 1; // add a 'demo' widget to the top sidebar ... $active_widgets[ $sidebars['a'] ][0] = 't5_demo_widget-' . $counter; // ... and write some text into it: $demo_widget_content[ $counter ] = array ( 'text' => "this works!\n\namazing!" ); #update_option( 'widget_t5_demo_widget', $demo_widget_content ); $counter++; // that was easy. now a rss widget. more fields, more fun! $active_widgets[ $sidebars['a'] ][] = 'rss-' . $counter; // the latest 15 questions from wordpress stack exchange. $rss_content[ $counter ] = array ( 'title' => 'wordpress stack exchange', 'url' => 'http://wordpress.stackexchange.com/feeds', 'link' => 'http://wordpress.stackexchange.com/questions', 'items' => 15, 'show_summary' => 0, 'show_author' => 1, 'show_date' => 1, ); update_option( 'widget_rss', $rss_content ); $counter++; // okay, now to our second sidebar. we make it short. $active_widgets[ $sidebars['b'] ][] = 't5_demo_widget-' . $counter; #$demo_widget_content = get_option( 'widget_t5_demo_widget', array() ); $demo_widget_content[ $counter ] = array ( 'text' => 'the second instance of our amazing demo widget.' ); update_option( 'widget_t5_demo_widget', $demo_widget_content ); // now save the $active_widgets array. update_option( 'sidebars_widgets', $active_widgets ); } wp-admin/widgets.phpに移動すると、3つのプリセットウィジェットが表示されます。以上です。つかいます ...dynamic_sidebar( 'top-widget' ); dynamic_sidebar( 'bottom-widget' ); ...ウィジェットを印刷する.ちょっとした不備があります:あなたは最初の登録のために2回フロントエンドをロードしなければなりません。 誰かがここで手助けをすることができれば私はとても感謝するでしょう。