web-dev-qa-db-ja.com

PHPを使用して、あるサイドバーから別のサイドバーにウィジェットを挿入します。

問題:

  • 私はTwenty Seventeenを拡張し、ホームページのコンテンツの上に新しいウィジェット領域( "call to action")を追加しました。ホームページでは、そのサイドバーを表示したい場所に表示しますが、他のページではこれらの(重要な)ウィジェットをデフォルトのTwenty Seventeenサイドバーに表示したいです。
  • これまでのところ、私のウィジェットを表示するために、ホーム以外の画面用にメインウィジェットの上に新しいウィジェット領域を挿入しました。これには、さまざまなCSS/HTMLの煩わしさと、親のテーマからの逸脱がありますが、それらについては扱いたくありません。
  • 私が本当に欲しいのは、私の「行動を促す」ウィジェットをもう一方のサイドバーに直接インジェクトすることです。

したがって、基本的にこれはつまり、サイドバーに保存されているウィジェットを取得するためにfunctions.phpフィルターコードを使用してから、表示される前に別のサイドバーに挿入する方法が必要です _になります。

これは、状況に応じて同じウィジェットを複数のサイドバーに配置する必要があるすべての種類のシナリオ、特に「十分なサイドバー」を持たない柔軟性のない親テーマを扱う場合に役立ちます。

「ウィジェットコントロール」プラグインや、状況に応じて個々のウィジェットを表示/非表示にできるJetpackオプションについて説明する必要はありません。私が必要としているのは、ウィジェットがどの他のサイドバーに表示されるかを制御する方法です。

プラグインの提案は歓迎します彼らが重要な問題を解決するならば。

ありがとうございます。私はどちらかの方法で私自身のためにこれを理解しようとしますそして私が満足のいく解決策を得たら返事をします:)

1
jerclarke

sidebar-injectフックの助けを借りてsidebar-targetサイドバーの前にdynamic_sidebar_beforeサイドバーを挿入するという(テストされていない)アイデアがあります。

add_action( 'dynamic_sidebar_before', 'wpse_inject_sidebar', 10, 2 );

function wpse_inject_sidebar( $index, $has_widgets )
{   
    // Only target front-end
    if( is_admin() )
        return;

    // Only target 'sidebar-target'
    if( 'sidebar-target' !== $index )
        return;

    // Make sure 'sidebar-inject' is active
    if( ! is_active_sidebar( 'sidebar-inject' ) ) 
        return;

    // Avoid recursive loop
    remove_action( 'dynamic_sidebar_before', 'wpse_inject_sidebar', 10 );

    // Inject  'sidebar-inject' 
    dynamic_sidebar( 'sidebar-inject' );

    // Re-hook it again
    add_action( 'dynamic_sidebar_before', 'wpse_inject_sidebar', 10, 2 );       
}

ここでは、フックのコールバックの内側でdynamic_sidebar()を呼び出す前にアクションを削除することによって、再帰ループに気をつけます。

しかし、ここでは'sidebar-target'のみをターゲットにして、それが'sidebar-inject'と異なることを確認することで、実際には再帰ループを回避します。

1
birgire