web-dev-qa-db-ja.com

投稿タイプのページ付けがあるカテゴリは404を返します

次のようなカスタム投稿タイプのカテゴリテンプレートがあります。

<?php
    $category = get_query_var('cat');
    $paged = (get_query_var("page")) ? get_query_var("paged") : 1;
    $args = array(
        'cat' => $category,
        'paged' => $paged,
        'post_mime_type' => 'image',
        'posts_per_page' => 9,
        'post_status' => 'inherit',
        'post_type' => 'attachment'
    );
    query_posts($args);
    $count = $wp_query->found_posts; 
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <a href="<?php the_permalink(); ?>"><?php echo wp_get_attachment_image($image->ID, "medium"); ?></a>
    <h5><?php the_title(); ?></h5>
    <?php
        $attachment = get_post(get_post_thumbnail_id()); // Get post by ID
        echo '<p>'.$attachment->post_content.'</p>'
    ?>
<?php endwhile; endif; ?>
    <ul class="pagi">
        <li><?php posts_nav_link(' | ','< Previous','Next >'); ?></li>
        <li><?php echo "(Page: ". $paged . " of " . $wp_query->max_num_pages .")"; ?></li>
    </ul>
<?php wp_reset_query(); ?>

2ページ目を見ると、ページング以外のすべてが機能しています。 http://joshrodg.com/ourpictureshare/category/pictures/unknown/page/2/ 、404です。

URLがどのように表示されるのかわからないが、クエリの投稿の種類が問題の原因となっていると思います。

誰かが私を正しい方向に向けることができますか?

ありがとう、
ジョシュ

1
Josh Rodgers

解決策を見つけました!

カテゴリページでクエリを変更する機能を見つけることができました( https://wordpress.org/support/topic/custom-types-category-pagination-404/#post- 1913902 - 下の方の最初のページに、によって書かれています:Mark/t31os)。

これをfunctions.phpに追加します。

add_action( 'parse_query','changept' );
function changept() {
    $category = get_query_var('cat');
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    if (is_category() && !is_admin())
        set_query_var( 'cat', $category );
        set_query_var( 'paged', $paged );
        set_query_var( 'posts_per_page', 9 );
        set_query_var( 'post_status', 'inherit' );
        set_query_var( 'post_type', 'attachment' );
    return;
}

これがcategory.phpが今のように見えることです:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <a href="<?php the_permalink(); ?>"><?php echo wp_get_attachment_image($image->ID, "medium"); ?></a>
    <h5><?php the_title(); ?></h5>
    <?php
        $attachment = get_post(get_post_thumbnail_id()); // Get post by ID
        echo '<p>'.$attachment->post_content.'</p>'
    ?>
<?php endwhile; endif; ?>
    <ul class="pagi">
        <li><?php posts_nav_link(' | ','< Previous','Next >'); ?></li>
        <li><?php echo "(Page: ". $paged . " of " . $wp_query->max_num_pages .")"; ?></li>
    </ul>

更新:

私は自分のソリューションで問題に遭遇しました...それはすべてのページで実行されていました。カテゴリページを除くすべてのページが404を返していたので、問題を解決するにはカテゴリページでのみコードを実行する必要がありました。

これが更新されたコードfunctions.phpです。

$url = $_SERVER['REQUEST_URI'];
if (strpos($url,'category') !== false) {
    add_action( 'parse_query','changept' );
    function changept() {
        $category = get_query_var('cat');
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        if (is_main_query()) {
            set_query_var( 'cat', $category );
            set_query_var( 'paged', $paged );
            set_query_var( 'posts_per_page', 9 );
            set_query_var( 'post_status', 'inherit' );
            set_query_var( 'post_type', 'attachment' );
        }
        return;
    }
}

基本的に、これはWordの "category"がURLの一部であるかどうかを確認します。私はこれを私のcategory.phpページでのみ使用しているので、他のページに影響を与えることなく機能します。おそらくもっと良い解決策があるでしょうが、これは私のプロジェクトではうまくいきます。また、メインクエリをターゲットにするために別のifが追加されました。is_main_query()...この方法でページに他のクエリがある場合でも、それらは通常どおり機能します。

Miloの提案であるpre_get_postsと同じようなことができると確信していますが、私はテンプレートでその関数を使用する方法を理解することができませんでした。

0
Josh Rodgers