web-dev-qa-db-ja.com

カスタム投稿タイプのpre_get_posts

私はカスタムwp_queryを使うときページ上でちょうどうまく投稿を表示するカスタム投稿タイプを持っています、しかしそれはページネーションを壊すので、私はすでにページネーションオフセットを扱うためにそれを使っているので代わりにpre_get_postsを使用しよう投稿.

ただし、pre_get_postsを使用して特定のページ/投稿タイプの投稿タイプを設定しようとすると、404が表示されます。カスタム投稿タイプと同じ名前のカスタム投稿がそこにあります。 「ビジネス上の課題」は投稿の種類で、「直面しているビジネス上の課題」はリダイレクトされる投稿です。この投稿を削除したので、404を表示しています。

私のpre取得投稿機能:

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

そして私のカスタム投稿タイプ:

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

何がおかしいのですか?

1
evu

pre_get_postsは、ページテンプレートおよび静的フロントページでは機能しません。 WP_Queryクラスを正しく読めば、URLが解析された後にページIDがpのようなパラメータに渡されます。このパラメータの設定を解除してクエリが変更されるかどうかを確認することはできますが、これが動作させるために変更する唯一のパラメータになるかどうかは疑問です。これで遊んだことがないので、すべてが単なる純粋な憶測です。これは、誰かがページテンプレートのpre_get_postsで遊ぶ機会です。

ここでカスタムクエリを使用して必要なものを出力する必要があります。ページネーションに関しては、それを機能させるためにあなたは以下のあなたのカスタムクエリを追加する必要があります。

これはあなたがあなたの引数を定義する前に行きます

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

静的フロントページの'paged''page'に変更することを忘れないでください

その後、クエリ引数に'paged'パラメータを設定する必要があります。

'paged' => $paged,

カスタムクエリの$max_num_pagesプロパティをページ付け関数に渡すのと同じくらい簡単です。

カスタムクエリがこのようになっている場合

$q = new WP_Query( $args );

次に、次のように$q->max_num_pagesをページ区切り関数に渡します。

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

編集

あなたのコードについてたった一つか二つのメモ

  • ページテンプレートにカスタム投稿タイプを表示する場合は、has_archivefalseに設定する必要があります。それ以外の場合は、アーカイブテンプレートを使用してカスタム投稿タイプが表示されます。

  • あなたがあなたのカスタム投稿タイプ archive templateで404エラーを受け取ることについて話しているなら、あなたはただパーマリンク設定ページにアクセスすることによってあなたのパーマリンクをフラッシュする必要がありますバックエンドです。カスタムコードやフィルタは一切必要ありません。

編集2

あなたのペーストから(これはあなたの質問に対する編集であるべきです)、あなたはここでいくつかの小さな問題を抱えています

  • wp_reset_query()は間違っています。これはquery_postsと共に使用されますが、絶対に使用しないでください。 wp_reset_postdata()を使うべきです

  • クエリの上にページ付けを追加しようとしているようです。これが機能するためには、最初にカスタムクエリを定義する必要があります。ただし、ループの前にページ付けを追加することはできます。

  • 私が言ったように、あなたはnext_posts_link()$max_pagesパラメータを設定する必要があります

あなたのクエリはこれに似ているはずです

$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