web-dev-qa-db-fra.com

pre_get_posts sur le type de publication personnalisé

J'ai un type de message personnalisé qui affiche correctement les messages sur la page lorsque j'utilise un wp_query personnalisé, mais qui interrompt la pagination; des postes.

Lorsque j'essaie d'utiliser pre_get_posts pour définir le type de publication pour une page/type de publication particulière, il affiche un message 404. J'ai eu une publication personnalisée avec la même chaîne dans le nom que le type de publication personnalisé; "business-challenges" est le type de message et "face-business-challenges" était le message auquel il a été redirigé. Depuis que j'ai supprimé ce message, il ne montre plus qu'un 404.

Ma fonction de pré-postage:

    function query_business_challenges( $query ) {

        if ( ! is_admin() && $query->is_main_query() && is_page('business-challenges')) {
            $query->set( 'post_type', 'business-challenges' );
        } // end if
    }
    add_action( 'pre_get_posts', 'query_business_challenges', 1 );

Et mon type de message personnalisé:

    function pt_business_challenges() {
        $labels = array(
            'name'                => 'Business Challenges',                        
            'singular_name'       => 'Business Challenge',                         
            'menu_name'           => 'B. Challenges',                        
            'parent_item_colon'   => 'Business Challenges',                        
            'all_items'           => 'All Business Challenges',                    
            'view_item'           => 'View Business Challenge',                    
            'add_new_item'        => 'Add New Business Challenge',                 
            'add_new'             => 'Add New',
            'edit_item'           => 'Edit Business Challenge',                    
            'update_item'         => 'Update Business Challenge',                  
            'search_items'        => 'Search Business Challenges',                 
            'not_found'           => 'Not found',
            'not_found_in_trash'  => 'Not found in Trash',
        );
        $args = array(
            'label'               => 'business-challenges',                         
            'description'         => 'For New and Previous Business Challenges',   
            'labels'              => $labels,
            'supports'            => array( 'title', 'editor', 'excerpt', 'thumbnail', 'revisions', 'custom-fields', ),
            'hierarchical'        => false,
            'public'              => true,
            'show_ui'             => true,
            'show_in_menu'        => true,
            'rewrite' => array( 'slug' => '/business-challenges'),                  
            'show_in_nav_menus'   => true,
            'show_in_admin_bar'   => true,
            'menu_position'       => 7,
            'menu_icon'           => 'dashicons-chart-area',         
            'can_export'          => true,
            'has_archive'         => true,
            'exclude_from_search' => false,
            'publicly_queryable'  => true,
            'capability_type'     => 'page',
        );
        register_post_type( 'business-challenges', $args );                         
    }
    add_action( 'init', 'pt_business_challenges', 0 );

Qu'est-ce que je fais mal?

1
evu

pre_get_posts ne fonctionne pas sur les modèles de page et les pages de garde statiques. Cela fera 404. Si je lis correctement la classe WP_Query, l'ID de la page est passé à un paramètre tel que p une fois l'URL analysée. Vous pouvez essayer de désactiver ce paramètre et vérifier s’il modifie la requête, mais je doute que ce soit le seul paramètre à modifier pour le faire fonctionner. Je n'ai jamais joué avec ça, alors tout n'est que pure spéculation. C'est tout à fait une opportunité pour quelqu'un de jouer avec pre_get_posts sur les modèles de page

Vous devez utiliser une requête personnalisée ici pour générer ce dont vous avez besoin. Comme pour la pagination, vous devez ajouter ce qui suit votre requête personnalisée pour la faire fonctionner

Cela va avant de définir vos arguments

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;

N'oubliez pas de changer 'paged' en 'page' pour les pages de garde statiques

Vous devez ensuite définir le paramètre 'paged' dans vos arguments de requête.

'paged' => $paged,

Il est aussi facile de passer la propriété $max_num_pages de votre requête personnalisée à votre fonction de pagination.

Exemple

Si votre requête personnalisée ressemble à ceci

$q = new WP_Query( $args );

alors vous devez passer $q->max_num_pages à votre fonction de pagination comme suit

next_posts_link( 'Next posts', $q->max_num_pages );

MODIFIER

Juste une ou deux notes sur votre code

  • Si vous souhaitez afficher des types de publication personnalisés sur des modèles de page, vous devez définir has_archive sur false. Sinon, le modèle d'archive sera utilisé pour afficher les types de publication personnalisés.

  • Si vous parlez d’obtenir des erreurs 404 sur votre type de message personnalisé archive template, il vous suffit de vider vos permaliens en visitant la page des paramètres de permalien. Pas besoin de n'importe quel type de code personnalisé ou de filtres.

EDIT 2

De votre coller ( qui devrait être une modification de votre question ), vous avez quelques petits problèmes ici

  • wp_reset_query() est faux. Il est utilisé avec query_posts que vous ne devriez jamais utiliser. Vous devriez utiliser wp_reset_postdata()

  • Il semble que vous essayez d'ajouter votre pagination en plus de votre requête. Pour que cela fonctionne, vous devez d'abord définir votre requête personnalisée. Vous pouvez cependant ajouter votre pagination avant la boucle.

  • Comme je l'ai dit, vous devez définir le paramètre $max_pages dans next_posts_link()

Votre requête devrait ressembler à ceci

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$args = array(
    'paged' => $paged,
    //Rest of your arguments
);
$loop = new WP_Query( $args );

/*
 * If you need your pagination above the loop,
 * this is the earliest to add it. You cannot add it above
 */
next_posts_link( 'Next Posts', $loop->max_num_pages );
previous_posts_link( 'Previous Posts' );

if ( $loop->have_posts() ) {
    while ( $loop->have_posts() ) {
    $loop->the_post();

        //YOUR LOOP

    } // endwhile

    // Add pagination here
    next_posts_link( 'Next Posts', $loop->max_num_pages );
    previous_posts_link( 'Previous Posts' );
    // Reset postdata, VERY VERY IMPORTANT
    wp_reset_postdata();
} // endif
2
Pieter Goosen