web-dev-qa-db-ja.com

カスタムサイドバーでそれを置き換えるためにサイドバー呼び出しにフックする方法

CPTの条件付きステートメントに基づいて、20のテーマのsidebar-2をカスタムサイドバーに置き換えます。そのため、ページに特定のカスタム投稿タイプが表示されている場合はカスタムサイドバーを表示し、それ以外の場合はデフォルトのサイドバーを表示します。

テーマを変更したり、子テーマを使用せずに(つまり純粋にプラグインから)これを実行したいです。

これが私がこれまでに持っているものです:

register_sidebar( array(
    'name'         => __( 'Custom Sidebar' ),
    'id'           => 'custom-sidebar',
    'description'  => __( 'My Custom Sidebar' ),
    ) );

add_action('get_header','change_dd_sidebar');
function change_dd_sidebar() {
    if ( is_singular('my_cpt')) { // Check if we're on a single post for my CPT called "ips_due_diligence". Need another check for index pages too.
       unregister_sidebar( 'sidebar-2' ); //remove the default right sidebar
       dynamic_sidebar( 'custom-sidebar' ); //this doesn't replace the right sidebar - the content appears at the top of the page - no good...
   }
}

sidebar-2の呼び出しにフックしてそれを自分のものに置き換える方法はありますか?

2
harryg

私はこれを考え出しました。トリックは、get_sidebarフックを使用して、CPTページ(アーカイブまたは単数またはcpt分類アーカイブ)にあるかどうか、および置換したいサイドバーが置換したいものかどうかを確認するためにいくつかの条件を実行することです($sidebar == 'content') 。

これらの条件が満たされた場合、sidebar-2の登録を解除し、独自のサイドバーを追加します。これはおそらくcontentサイドバーとしてsidebar-2を持たないテーマではうまくいかないでしょう。

//Register the alternative sidebar
register_sidebar( array(
    'name'         => __( 'Custom Sidebar' ),
    'id'           => 'cpt-sidebar',
    'description'  => __( 'Sidebar for showing cpt-specific content.' ),
    'before_title' => '<h1 class="widget-title">',
    'after_title'  => '</h1>', 
    'before_widget' => '<aside id="%1$s" class="widget %2$s">',
    'after_widget'  => '</aside>',
    ) );

add_action('get_sidebar','change_cpt_sidebar');
function change_cpt_sidebar($sidebar) {

    if ( (is_post_type_archive('my_cpt') || is_singular('my_cpt') || is_tax('cpt_tax')) && $sidebar == 'content') { // Check if we're on a CPT page
        unregister_sidebar( 'sidebar-2' );
        ?>
        <div id="content-sidebar" class="content-sidebar widget-area" role="complementary">
            <?php
        dynamic_sidebar( 'cpt-sidebar' );
        ?>
    </div>
    <?php
     }
}
1
harryg

unregister_sidebar は使いません

Sidebar-content.phpファイルをプラグインにコピーしてデフォルトのsidebar-2に条件を追加し、そのファイルに条件付きの新しいsidebar-4を追加します。

<?php
if( is_active_sidebar( 'sidebar-4' ) && is_singular('your-cpt') ) {
}
?>
<div id="content-sidebar" class="content-sidebar widget-area" role="complementary">
<?php dynamic_sidebar( 'sidebar-4' ); ?>
</div><!-- #content-sidebar -->

子テーマで行うのと非常によく似た、新しいサイドバー4を登録するためのコードを含むfunctions.phpまたはplugin.phpファイルを追加する必要もあります。

function cpt_widget() {

    register_sidebar( array(
    'name'          => __( 'Custom Post Type Sidebar', 'twentyfourteen' ),
    'id'            => 'sidebar-4',
    'description'   => __( 'Appears on the right for cpts pnly.', 'twentyfourteen' ),
    'before_widget' => '<aside id="%1$s" class="widget %2$s">',
    'after_widget'  => '</aside>',
    'before_title'  => '<h1 class="widget-title">',
    'after_title'   => '</h1>',
) );
}
add_action( 'widgets_init', 'cpt_widget' );

Single-cpt.phpファイルを作成してそこにsidebar-4を追加することもできます。

0
Brad Dalton