web-dev-qa-db-fra.com

Manière de se connecter à un appel de barre latérale pour le remplacer par une barre latérale personnalisée

Je souhaite remplacer le sidebar-2 dans le thème vingtforteen par une barre latérale personnalisée basée sur une instruction conditionnelle pour CPT. Donc, si la page affiche un certain type de publication personnalisée, affichez ma barre latérale personnalisée, sinon affichez simplement la barre latérale par défaut.

Je veux faire cela sans changer de thème ni utiliser un thème enfant (c'est-à-dire uniquement à partir d'un plugin).

Voici ce que j'ai jusqu'à présent:

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...
   }
}

Est-il possible de raccrocher à l'appel pour sidebar-2 et de le remplacer par le mien?

2
harryg

J'ai compris cela. L'astuce consiste à utiliser le hook get_sidebar et à exécuter certaines conditions pour vérifier si nous sommes sur une page CPT (archive ou archive taxonomie singulière ou cpt) et si la barre latérale à laquelle nous sommes accrochés est celle que nous voulons remplacer ($sidebar == 'content') .

Si ces conditions sont remplies, nous désenregistrons sidebar-2 et ajoutons notre propre barre latérale. Cela ne fonctionnera probablement pas avec un thème pour lequel sidebar-2 ne figure pas dans la barre latérale content.

//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

Je ne voudrais pas utiliser unregister_sidebar

Je copierais le fichier sidebar-content.php dans un plug-in et ajouterais des conditions au sidebar-2 par défaut, en plus d'ajouter un nouveau sidebar-4 dans ce fichier avec les conditions correspondantes.

<?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 -->

Vous devez également ajouter un fichier functions.php ou plugin.php avec le code pour enregistrer votre nouveau sidebar-4, à l’instar de ce que vous feriez avec un thème enfant.

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' );

Vous pouvez également créer un fichier single-cpt.php et y ajouter la barre latérale-4.

0
Brad Dalton