web-dev-qa-db-ja.com

特定のサイドバーから特定のウィジェットを禁止する

開発中のテーマにサイドバーがいくつかあります。それらのいくつかは、いくつかの種類のウィジェットのみを保持するように設計されています。だから私はプラグインを使わずに他のウィジェットを締め出す方法を見つけようとしています。

多くのグーグルの後、私は2つの選択肢しかないと思います。

  1. 特定のウィジェットが特定のウィジェット領域にドラッグ&ドロップされないようにするには、ウィジェット管理ページでjqueryを使用します。完璧な世界では、この特定のウィジェットはこの特定のウィジェット領域では許可されていないというメッセージがユーザーに表示されます。
  2. サーバー側のウィジェットを削除するには、wp 'sidebars_widgets'フィルターを使用してください。

最初はより良い方法のように聞こえますが、ほとんどの場合パフォーマンスが賢明です。どう思いますか?しかし、私は実用的な解決策を見つけることができず、私のjqueryの知識では十分ではありません。残念なことに、私のPHP知識も明らかに、二番目の解決策を見つけるのに十分ではありません。これは私が持っているものです:

add_filter( 'sidebars_widgets', 'wp150734_code_disable_widgets' );


function wp150734_code_disable_widgets( $sidebars_widgets ) {

    // This code works for one sidebar & one widget :
    $allowed_widget  = 'wp150734_widget_social';
    $sidebar_to_check = 'wp150734_widgets_navbar';

    // But I want to check the array of sidebars with allowed widgets:
    $sidebars_to_check = array(
        // allowed widgets in 'wp00734_widgets_navbar'
        'wp150734_widgets_navbar' => array(
            'widget_search',
            'widget_text',
            'wp150734_widget_social'
        ),
        // allowed widgets in 'wp00734_widgets_footer'
        'wp00734_widgets_footer' => array(
            'widget_search',
            'widget_text',
            'wp00734_widget_social'
        )
    );


    foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) {

        // Check if we even need to check this sidebar
        if ( $sidebars_key != $sidebar_to_check )
        continue;

        if ( $sidebars_widget ) {

            foreach ( $sidebars_widget as $k=>$v ) {

                // Look for our custom widget and unset all other widgets from the $sidebars_widgets array
                if ( stripos( $v, $allowed_widget ) === false ) {
                    unset( $sidebars_widgets[$sidebars_key][$k] );
                }

            }
        }
    }

    return $sidebars_widgets;
};

皆さんはどう思いますか?私はjqueryソリューションがより良いだろうように私は感じていますが、関連するものを見つけることができません。

編集:私はすべての標準に加えて2-3カスタムウィジェットがあります。これらのウィジェットはすべて、登録されているすべてのウィジェット領域で正常に機能します。今私はテーマのトップナビゲーションバーを持っています。データを保持するように設計されています。メニュー、ソーシャルアイコン、検索、選択された順序のテキストが好きです。並べ替えることができるウィジェットの形でそれらすべてをすでに持っているので、それをナビゲーションバーにカスタムウィジェット領域を登録し、ユーザーにウィジェットを選択させてそれらを並べ替えることは論理的なアイデアのように思えます。機能を複製する必要はありません - ウィジェットは既に箱から出してそれを提供しています。唯一の問題は、すべてのウィジェットがナビゲーションバーに配置されるように設計されていないことです。

2
Nikita

あなたはそれをひっくり返しています。ウィジェットの概念は、ウィジェット領域(AKAサイドバー)間で転送可能になるように設計されています。ウィジェットが譲渡できない場合は、本当のワードプレスウィジェットではありません。

独自のウィジェットのフレームワークを作成することは、楽しいアイデアではないように思えます。ワードプレスのコアコードとの闘いに加えて、あなたは自分自身がウィジェットについての確立されたユーザーの期待と闘っているのを見つけるでしょう。

つまり、基本的に2つの選択肢があります。それらを真のワードプレスウィジェットではないことをユーザーに知らせるために「Baitarのサイドバーとウィジェット」と呼び、それらを管理するためにワードプレスのコアコードを複製します。あるいは、なぜ標準以下のウィジェットを書いているのかを自問して、デザインとコードを修正してください。

3番目の方法、そしておそらく最も簡単な方法は、ユーザーに必要なことをさせ、ウィジェットが機能しないことを自分で確認させることです。そのための適切な文書を提供するだけです。

1
Mark Kaplun