web-dev-qa-db-fra.com

Comment définir une publication de type publication personnalisée comme page statique?

J'écris mon thème personnalisé à partir de rien et j'ai un type de message personnalisé 'my_frontpage' et je souhaite déclarer l'un de ses messages en première page. Je veux le faire par l’administrateur, il suffit donc d’ajouter mon cpt à la zone Front Page de la sélection dans Apparence >> Personnaliser >> Static Front Page .

Cette question a été discutée à quelques reprises sur Internet. Cependant, je ne trouvais pas comment faire des instructions expliquant de manière détaillée toutes les étapes pour atteindre cet objectif.

Jusqu'à présent, j'ai compris que je devais utiliser une sorte de crochet pour élargir le choix des pages de couverture disponibles avec les messages de mon cpt. Mais quel crochet utiliser? Je ne saurais même pas si je dois utiliser une action ou un crochet de filtre? Alors, est-ce que quelqu'un pourrait me guider à travers cette question en termes simples?

Le résultat le plus proche que j'ai pu trouver était Cette question . Cependant, je ne suis pas encore capable de comprendre pleinement ce qui se passe là-bas ...

3
Bunjip

J'ai eu le temps d'examiner votre problème et la page options-reading.php qui est le modèle utilisé pour afficher la page des paramètres de lecture dans le backend.

Malheureusement, aucun filtre ne permet de filtrer ou d’ajouter des publications personnalisées en tant que publications persistantes dans un menu déroulant pouvant être sélectionné. Il y a deux filtres cachés que nous pouvons utiliser, ils sont

IMHO, je pense que get_pages voici une meilleure option. De cette façon, nous laisserons wp_dropdown_pages() prendre en charge tout le balisage. Nous devons cependant faire attention lorsque nous utilisons le filtre get_pages

  • Nous devrons nous assurer de ne cibler que la zone d'administration et en particulier la page des paramètres de lecture, sinon nous modifierons toute fonction/page utilisant la fonction get_pages().

Vous devez décider si vous avez besoin de pages à afficher avec les publications de type publication personnalisée ou si vous avez simplement besoin des types de publication personnalisés.

Vous pouvez essayer ce qui suit:

add_filter( 'get_pages', function ( $pages, $args )
{
    // First make sure this is an admin page, if not, bail
    if ( !is_admin() )
        return $pages;

    // Make sure that we are on the reading settings page, if not, bail
    global $pagenow;
    if ( 'options-reading.php' !== $pagenow )
        return $pages;

    // Remove the filter to avoid infinite loop
    remove_filter( current_filter(), __FUNCTION__ );

    $args = [
        'post_type'      => 'my_frontpage',
        'posts_per_page' => -1
    ];
    // Get the post type posts with get_posts to allow non hierarchical post types
    $new_pages = get_posts( $args );    

    /**
     * You need to decide if you want to add custom post type posts to the pages
     * already in the dropdown, or just want the custom post type posts in
     * the dropdown. I will handle both, just remove what is not needed
     */
    // If we only need custom post types
    $pages = $new_pages;

    // If we need to add custom post type posts to the pages
    // $pages = array_merge( $new_pages, $pages );

    return $pages;
}, 10, 2 );

Vous devriez maintenant voir vos publications de type publication personnalisée dans la liste déroulante. Notez que ce code affectera également le menu déroulant de la page du blog.

Pour éviter cela, vous pouvez utiliser un compteur statique pour compter le nombre de fois que le filtre a été exécuté, puis exécuter le traitement juste avant que le filtre ne soit appliqué à la liste déroulante de la page de blog. Le filtre sera exécuté 3 fois au total, alors que get_pages() sera exécuté 3 fois:

  • d’abord pour vérifier si nous avons réellement des pages à définir comme page de couverture statique.

  • la deuxième exécution sera à l'intérieur de wp_dropdown_pages() qui est utilisé par la liste déroulante des pages de couverture statiques

  • la dernière exécution sera à l'intérieur de wp_dropdown_pages() qui est utilisé par la liste déroulante de la page de blog

Donc, sur cette base, nous pouvons essayer

add_filter( 'get_pages', function ( $pages, $args )
{
    // First make sure this is an admin page, if not, bail
    if ( !is_admin() )
        return $pages;

    // Make sure that we are on the reading settings page, if not, bail
    global $pagenow;
    if ( 'options-reading.php' !== $pagenow )
        return $pages;

    // Remove the filter to avoid infinite loop
    remove_filter( current_filter(), __FUNCTION__ );

    // Setup our static counter
    static $counter = 0;

    // Bail on the third run all runs after this. The third run will be 2
    if ( 2 <= $counter )
        return $pages;

    // Update our counter
    $counter++;

    $args = [
        'post_type'      => 'my_frontpage',
        'posts_per_page' => -1
    ];
    // Get the post type posts with get_posts to allow non hierarchical post types
    $new_pages = get_posts( $args );    

    /**
     * You need to decide if you want to add custom post type posts to the pages
     * already in the dropdown, or just want the custom post type posts in
     * the dropdown. I will handle both, just remove what is not needed
     */
    // If we only need custom post types
    $pages = $new_pages;

    // If we need to add custom post type posts to the pages
    // $pages = array_merge( $new_pages, $pages );

    return $pages;
}, 10, 2 );

Si vous visitez le front-end et la page d'accueil, vous constaterez qu'il sera redirigé vers la page de publication unique. En effet, par défaut, la requête principale sur une page de garde statique est définie pour interroger le type de publication page. Cela provoque un retour 404 et redirect_canonical() redirige ensuite vers la page de publication unique. Ceci est facile à résoudre, tout ce que nous devons faire est d’ajuster la requête principale sur la page de couverture statique.

add_action( 'pre_get_posts', function ( $q )
{
    if (    !is_admin() // Only target the front end
         && $q->is_main_query() // Only target the main query
         && 'page' === get_option( 'show_on_front' ) // Only target the static front page
    ) {
        $q->set( 'post_type', 'my_frontpage' );
    }
});

Votre page d'accueil statique s'affichera alors correctement.

Il ne vous reste plus qu'à définir un modèle. Vous pouvez simplement créer un front-page.php, WordPress l'utilisera automatiquement

2
Pieter Goosen

Il existe également un moyen supplémentaire d’éviter d’utiliser un modèle de page et de laisser Wordpress charger la page de couverture en utilisant le modèle de type de publication approprié. Cela permet d'éviter la duplication de code si vous souhaitez laisser la page d'accueil identique à la publication individuelle elle-même:

add_filter( 'template_include', 'add_front_page_template_path', 10, 1);

function add_front_page_template_path( $template_path ) {
    if (
        is_front_page() 
        && get_option( 'show_on_front' ) == 'page' 
        && ( $post_id = get_option( 'page_on_front' ) )
        && ( $post_type = get_post_type( $post_id ) ) != 'page' 
    ) {
        $_template_path = get_single_template( $post_type );

        /* In case there’s no template */
        $template_path = ( $template_path == '' ) ? $template_path : $_template_path;
    }

    return $template_path;  
}
0
cruzquer

Alors que Pieter a résolu le problème de manière élégante et complète sans aucun doute, je suis finalement allé avec une autre solution, que je souhaite partager ici aussi. Peut-être que certaines personnes feront face à des problèmes similaires dans le temps à venir.

Pour définir le type de message personnalisé décrit dans ma question, j'ai utilisé un plugin appelé Pods . Comme les développeurs et la communauté du plug-in sont susceptibles de gérer régulièrement des types de publication personnalisés, j'ai pensé qu'il serait peut-être utile de poser ma question également sur leur canal de support.

C’est un gars très utile de l’équipe de développement de Pods qui m’a orienté dans la direction avec laquelle je suis finalement allé. Ainsi, au lieu de définir un type de publication personnalisé dans le but de créer une page de garde statique très individuelle, il a recommandé d'ajouter des champs personnalisés à une page standard, qui devrait devenir la page de couverture. C'est ce que j'ai fait pour atteindre mon objectif et c'est ce que je recommande également aux autres utilisateurs.

Du point de vue de la modélisation des données, il n’ya aucune raison de définir un type de données complet ou, par exemple, une classe, si vous souhaitez l’appliquer à un seul élément - dans mon cas, une seule page de couverture. J'ai utilisé un autre plugin appelé Advanced Custom Fields , car cela permet d'utiliser des types de données plus avancés pour vos champs personnalisés que ceux proposés par Wordpress. Vous pouvez également ajouter vos champs personnalisés via le fichier functions.php. J'espère que cela pourra aider.

0
Bunjip