web-dev-qa-db-ja.com

他のウィジェットがレンダリングされていないときにのみサイドバーにウィジェットを表示しますか?

私はカスタムテーマに取り組んでいます。基本的には現在のサイトのルックアンドフィールをWordPressに移行します。すべてのほとんどがPagesに基づいており、これらのすべてのページに左側のサイドバーがあります。これらのページのうち、以下の3つのうちの1つです。

  1. ページはセクションの一部なので、ウィジェット内のセクションのすべての部分のリストを表示します。
  2. ページはセクションの一部なので、ウィジェット内のセクションのすべての部分のリストを表示しますが、子も含みます。したがって、これらのページは上の別のウィジェットに表示されます。
  3. ページはセクションの一部ではないため、兄弟ページや子ページはありません。

#3にあるもののために別のページテンプレートを作成する必要はありません。現在、#3のものは何もレンダリングしないでしょう、get_sidebar()関数を含んでいる脇を除いて。このような場合は、代わりにすべてのセクションをリストしたいので、そこに何かあります。

私はこれの良い例を見つけることができないようです。すべてのコア機能のうち、サイドバーで利用可能という意味でそのサイドバーにウィジェットが含まれているかどうかを確認するように見えます。私はまた、ウィジェットに変数を設定してそれをページ上で読み込もうとしましたが、それもうまくいかないようでした。

他のウィジェットが表示されていない場合に追加のウィジェットを条件付きで表示する方法を教えてください。または、このウィジェットを追加した場合、他のウィジェットが同じサイドバーに表示されている場合は非表示にしますか。

更新:「表示されていない」と表示された場合、ウィジェットは何もエコーバックしないという意味です。たとえば、私のウィジェットは表示するもののリストを取得します。リストが空の場合は、ウィジェットをレンダリングしない(またはエコーアウトしない)条件付きロジックが既にあります。例を以下に示します。

$subpages = wp_list_pages('title_li=&child_of='.$thisPageID.'&echo=0&depth=1');
if($subpages)
{
    // I have subpages, so display them
    echo $subpages;
}
else
{
     // no subpages, doesn't echo anything. 
}

それが他のものに当たっても何もレンダリングされない場合、サイドバーに自分が戻ってこなかったことを知るために使用できるロジックがあるかどうか疑問に思っています。

別の見方をすると、デフォルトのウィジェット、つまりすべてのリストがあるということです。しかし、他に表示するコンテンツがある場合は、デフォルトのウィジェットを非表示にして代わりに表示します。したがって、すべてのページに何かがあります。

Update 2:友人が私が以前は考えていなかったアイデアを思いついた - このウィジェットはただ論理の反対を持つことができる以前のものの出力に頼るのではなく、以前のもののうちの1つをレンダリングしました。そのため、この2つは相互に排他的であるため、すべてのページが本来あるべきものをレンダリングします。この簡単な例では、それはうまくいくでしょう。ウィジェットが何かをエコーし​​ているかどうかをテストする方法があるかどうか、私はまだ非常に興味があります。

1
jmlumpkin

私はあなたの質問が何であるかを100%明確にしているわけではないので、これが条件付きウィジェットの正しい方向にあなたを向けることができれば幸いです。私はあなたに3つの選択肢を与えます。

1.is_active_widgetは、ウィジェットIDに基づいてウィジェットがアクティブかどうかを確認します。

2.is_active_sidebarを使用してサイドバーをさらに作成すると、通常はウィジェットの出力をより適切に制御できます。

3.プラグインを使用してください。ポストロジックや条件付きロジックが組み込まれたプラグインがいくつかあります。

4.widget_display_callback フィルタを使ってみてください。

add_filter('widget_display_callback','your_custom_function',10,3);
1
Wyck

私はWordpressのエキスパートではありませんが、あなたが提案しているように空のコンテンツを直接検出することは可能ではないと思います。私がお勧めすることが2つあります。

1)私の好み:あなたの "セクションの表示部分"ウィジェットに追加のロジックを追加して、ページがセクション内にない場合はセクションを表示するようにします。

2)jQueryを利用する新しいウィジェットを作成してください。その後、jQueryを使って他のウィジェットにコンテンツがあるかどうかを判断し、それに応じて表示することができます。

0
user1269310

ウィジェットロジック プラグインを使用して、ウィジェットが何かをエコーし​​ているかどうかをテストし、必要に応じてウィジェットの内容を変更することができます。

インストール後、 'widget_content'フィルタを利用することができます。

次に、ウィジェットのDOMツリーによっては、適切なノードがあるかどうかをテストできます。

    function check_empty_widget($content='' , $widget_id='')    {
        if ($widget_id == "your-widget-id-1" || $widget_id == "your-widget-id-2" ) {
                $htmldoc = new DOMDocument();
                $htmldoc->loadHTML($content);
                $tag=$htmldoc->getElementsByTagName('ul')->item(0);
                return $tag->hasChildNodes()? $content:'';
        }
        return $content;
}
add_filter('widget_content', 'check_empty_widget',10,2);

正規表現でコンテンツをフィルタリングすることも可能です。

0
infrcl