it-swarm.com.de

Kategorie mit Posten-Typ-Paginierung gibt 404 zurück

Ich habe eine Kategorie-Vorlage mit einem benutzerdefinierten Beitragstyp, der wie folgt aussieht:

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

Alles funktioniert außer dem Paging ... wenn ich Seite 2 ansehe, sieht die URL so aus: http://joshrodg.com/ourpictureshare/category/pictures/unknown/page/2/ , das ist ein 404.

Ich bin mir nicht sicher, wie die URL aussehen soll, aber ich denke, dass der Post-Typ in meiner Abfrage das Problem verursacht.

Könnte mich jemand in die richtige Richtung weisen?

Vielen Dank,
Josh

1
Josh Rodgers

Ich habe eine Lösung gefunden!

Auf der Kategorieseite ( https://wordpress.org/support/topic/custom-types-category-pagination-404/#post-1913902 -) konnte ich eine Funktion finden, mit der die Abfrage geändert wurde Seite nach unten, geschrieben von: Mark/t31os).

Fügen Sie dies zu functions.php hinzu:

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

So sieht category.php jetzt aus:

<?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>

AKTUALISIEREN:

Ich hatte ein Problem mit meiner Lösung ... sie wurde auf allen Seiten ausgeführt. Alle Seiten mit Ausnahme der Kategorieseite gaben 404 zurück. Daher musste ich den Code nur auf der Kategorieseite ausführen, um das Problem zu beheben.

Hier ist der aktualisierte Code 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;
    }
}

Grundsätzlich wird überprüft, ob die Word- "Kategorie" Teil der URL ist, und da ich diese nur auf meiner category.php-Seite verwende, funktioniert dies, ohne dass sich dies auf eine andere Seite auswirkt. Es gibt wahrscheinlich eine bessere Lösung, aber das funktioniert für mein Projekt. Außerdem wurde eine weitere if hinzugefügt, um die Hauptabfrage zu steuern: is_main_query()... auf diese Weise funktionieren andere Abfragen auf der Seite weiterhin normal.

Ich bin sicher, dass Sie mit pre_get_posts etwas Ähnliches tun können, was Milos Vorschlag ist, aber ich konnte einfach nicht herausfinden, wie diese Funktion mit meiner Vorlage verwendet werden kann.

0
Josh Rodgers