web-dev-qa-db-fra.com

Comment ajouter un widget spécifique à une seule page?

Je voudrais montrer un widget dans une seule page de mon site, car je peux voir que ce n'est pas possible, non?

Dois-je ajouter cela pour toutes les pages de mon site ou non?

6
itsme

Cela dépend de l'endroit où vous souhaitez afficher le widget.

Commençons par l’enregistrement de la zone de widget (barre latérale):

add_action( 'wp_loaded', 'wpse_76959_register_widget_area' );
function wpse_76959_register_widget_area()
{
    register_sidebar(
        array (
            'name'          => __(
                'Widgets on page Sample Page',
                'theme_textdomain'
                ),
            'description'   => __(
                'Will be used on a page with a slug "sample-page" only.',
                'theme_textdomain'
                ),
            'id'            => 'sample-only',
            'before_widget' => '<div id="sample-only-widget">',
            'after_widget'  => '</div>',
            'before_title'  => '<h2>',
            'after_title'   => '</h2>',
        )
    );
}

C'est assez simple. Nous enregistrons une nouvelle zone de widget avec un balisage personnalisé.

enter image description here

Maintenant, nous devons le montrer quelque part. Nous pourrions ajouter une action personnalisée dans notre modèle page.php:

do_action( 'show_sample_widget' );

Ou nous pourrions utiliser une action existante, cela limiterait les endroits où le widget est disponible. Par exemple, l'action loop_start est appelée la première fois que nous appelons the_post() dans une boucle. Si nous voulons placer le widget en haut du contenu de la page, nous utilisons ce crochet:

add_action( 'loop_start', 'wpse_76959_render_widget' );

function wpse_76959_render_widget()
{
    is_page( 'sample-page' ) && dynamic_sidebar( 'sample-only' );
    remove_action( current_filter(), __FUNCTION__ );
}

Pour une action personnalisée, nous utiliserons plutôt:

add_action( 'show_sample_widget', 'wpse_76959_render_widget' );
7
fuxia

Il existe plusieurs plugins permettant d'afficher des widgets en fonction de conditions spécifiques:

  • Display Widgets : Interface propre et simple
  • Widget Context : Il a un peu plus d'options que le précédent
  • Widgets dynamiques : C'est la plus riche des fonctionnalités
  • Widget Logic : Ceci est destiné aux programmeurs car vous devez écrire la condition dans le code PHP. C'est à dire. is_page('about')

Une autre solution est fournie par le plugin suivant, qui vous permet de définir un ensemble personnalisé de widgets page par page, directement à partir de l'écran de la page d'édition:

3
marcochiesi

Si vous êtes à l'aise pour éditer les fichiers de modèles de votre thème:

Trouver où

dynamic_sidebar('side_bar_name');

est appelé, et avant ou après, ou pratiquement n'importe où sur votre site, utilisez:

$pageTitle =  get_the_title($post->ID); 
$targetPage = 'the title of the page you want to target goes here';

    if($pageTitle == $targetTitle){    
     the_widget( 'the_widget_unique_id_aka_name', $instance, $args);
    }
   //the_widget() calls a specific widget and displays it

Si vous voulez être plus clair à ce sujet: Créez une fonction dans functions.php qui ressemblerait à ceci:

function call_my_widget( $post ){
    $pageTitle =  get_the_title($post-ID); 
    $targetPage = 'the title of the page you want to target goes here';

        if($pageTitle == $targetTitle){    
         the_widget( 'the_widget_unique_id_aka_name', $instance, $args);
        }
}

appeler la fonction avec:

call_my_widget( $post );

cela doit être appelé dans la boucle ou lorsque la variable globale $post est existante.

Appelez ensuite cette fonction dans votre fichier de modèle (page.php peut-être?) Pour afficher vos widgets cibles uniquement sur votre page cible.

1
Vigs

Vous pouvez utiliser widget_display_callback: https://developer.wordpress.org/reference/hooks/widget_display_callback/ et changer simplement l'id de la page dans le code ci-dessous.

function custom_display_callback( $instance, $widget, $args ){
    if( is_page( 10 ) ){
        return false;
    }
    return $instance;
}
add_filter( 'widget_display_callback', 'custom_display_callback', 50, 3 );

J'espère que ça aide. À votre santé!

0
Jeffrey Carandang