it-swarm.com.de

Paginierung auf der Kategorieseite mit benutzerdefinierten Beitragstypen

Wordpress ist für mich nicht neu, aber ich stecke wirklich in diesem Code, den ich nicht richtig zum Laufen bringen kann.

Ich registriere einen benutzerdefinierten Beitragstyp News und überlasse dem benutzerdefinierten Beitragstyp die Verwendung der Wordpress-Kategorien

'taxonomies' => array('category')

So weit, ist es gut. Ich kann dem benutzerdefinierten Beitragstyp "Nachrichten" verschiedene Kategorien zuweisen. Aber ich möchte, dass die Leute Nachrichten aus einer bestimmten Kategorie sehen können. Also möchte ich, dass das mit der category.php-Seite gemacht wird. Das Problem ist, dass die Paginierung nicht funktioniert. Ich erhalte eine Seite nicht gefunden, wenn ich zu/page/2 gehe

Ich benutze diesen Code auf einer category.php Seite.

// Get post ID
$post_type = get_post_type( $post->ID );

// Get category ID
$category_id = get_cat_ID(single_cat_title('', false));

// Wordpress pagination
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

// WP_Query arguments
$args_news = array (
    'post_type'             => array( 'news' ),
    'pagination'            => true,
    'posts_per_page'        => '9',
    'orderby'               => 'date',
    'paged'                 => $paged,
    'cat'                   => $category_id,
);

// The Query
$query = new WP_Query( $args_news );

// The Loop
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post(); ?>
        <div>
            <h1><?php the_title(); ?></h1>
            <p><?php the_content(); ?></p>
        </div>
<?php }

} else { 
    // no news found
}
?>

<div class="pagination">
    <div class="previous-page"><?php previous_posts_link( 'Newer Posts' );?></div>
    <div class="next-page"><?php next_posts_link( 'Older Posts', $query->max_num_pages ); ?></div>
</div>

<?php
// Reset postdata
wp_reset_postdata();
1
3lb3rt

Bevor ich zu Ihrem Problem komme, möchte ich zunächst fragen, warum Sie eine benutzerdefinierte Abfrage auf einer Kategorieseite anstelle der Hauptabfrage verwenden. Sie sollten niemals die Hauptabfrage für eine benutzerdefinierte Abfrage auf einer Archivseite oder Ihrer Homepage ändern.

Wordpress bietet einen Aktions-Hook pre_get_posts , den Sie in Verbindung mit bedingten Tags verwenden können, um die Hauptabfrage als Ziel festzulegen und zu ändern, bevor sie auf bestimmten Seiten ausgeführt wird. Für Kategorieseiten wird die is_category() bedingte Prüfung geliefert.

Sie können einfach Folgendes in Ihrer functions.php tun, während Sie Ihre Standardschleife auf Ihrer Kategorieseite beibehalten. Nur ein Tipp, pre_get_posts verwendet die gleichen Parameter wie WP_Query

function add_news_to_category( $query ) {
    if ( !is_admin && $query->is_category() && $query->is_main_query() ) {

         $query->set( 'post_type', array( 'news' ) );
         $query->set( 'posts_per_page', '9' );
         $query->set( 'orderby', 'date' );

    }
}
add_action( 'pre_get_posts', 'add_news_to_category' );

OK, jetzt zu Ihrem eigentlichen Problem mit Ihrem Code.

  • Erstens müssen Sie wp_reset_query und wp_reset_postdata nicht zusammen verwenden. wp_reset_query wird tatsächlich in Verbindung mit query_posts verwendet, was Sie niemals verwenden dürfen, und ich meine niemals. Verwenden Sie einfach wp_reset_postdata afterWP_Queryandget_posts` und vergessen Sie nicht, dies zu tun

  • Zweitens schauen Sie sich Ihren Code genauer an. Sie haben $query = new WP_Query( $args_news );, aber dann haben Sie <?php next_posts_link( 'Older Posts', $custom_query->max_num_pages ); ?>. Finde den Unterschied? $query und $custom_query. So sollte <?php next_posts_link( 'Older Posts', $custom_query->max_num_pages ); ?><?php next_posts_link( 'Older Posts', $query->max_num_pages ); ?> sein

Zur weiteren Lektüre:

1
Pieter Goosen