web-dev-qa-db-fra.com

Catégorie avec les retours de pagination de type poste 404

J'ai un modèle de catégorie avec un type de message personnalisé qui ressemble à:

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

Tout fonctionne, sauf la pagination ... Quand je regarde la page 2, l'url ressemble à: http://joshrodg.com/ourpictureshare/category/pictures/unknown/page/2/ , qui est un 404.

Je ne sais pas à quoi l'URL est censée ressembler, mais je pense que le type de message de ma requête est à l'origine du problème.

Quelqu'un peut-il m'indiquer la bonne direction?

Merci,
Josh

1
Josh Rodgers

J'ai trouvé une solution!

J'ai pu trouver une fonction modifiant la requête sur la page de catégorie ( https://wordpress.org/support/topic/custom-types-category-pagination-404/#post-1913902 - le premier page vers le bas, écrit par: Mark/t31os).

Ajoutez ceci à 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;
}

Voici à quoi ressemble 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>

METTRE À JOUR:

J'ai rencontré un problème avec ma solution ... elle s'exécutait sur toutes les pages. Toutes les pages sauf la page de catégorie renvoyaient un 404, donc je devais exécuter le code uniquement sur la page de catégorie pour résoudre le problème.

Voici le code mis à jour 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;
    }
}

En gros, cela vérifie si le mot "catégorie" fait partie de l'URL et, comme je ne l'utilise que sur ma page category.php, cela fonctionnera sans affecter aucune autre page. Il existe probablement une meilleure solution, mais cela fonctionne pour mon projet. En outre, une autre variable if a été ajoutée pour cibler la requête principale: is_main_query()... De cette manière, si vous avez d'autres requêtes sur la page, elles continueront à fonctionner normalement.

Je suis sûr que vous pouvez faire quelque chose de similaire avec pre_get_posts, qui est la suggestion de Milo, mais je ne pouvais tout simplement pas comprendre comment utiliser cette fonction avec mon modèle.

0
Josh Rodgers