Support » Allgemeine Fragen » Pagination zeigt nicht alle Beiträge auf Index.php

  • Gelöst treibstoff

    (@treibstoff)


    Die Pagination arbeitet perfekt auf den Pages aber nicht auf der Index Seite.
    Problem:
    Es fehlen am Ende immer einige Einträge, wobei die eingestellte Zahl der Blogeinträge unter Einstellungen >> Lesen entweder zu viel zu vielen Seiten in der Pagination führt oder zu mehr oder weniger angezeigten Beiträgen….

    <?php 
    if ( get_query_var( 'paged' ) ) { $paged = get_query_var( 'paged' ); }
    elseif ( get_query_var( 'page' ) ) { $paged = get_query_var( 'page' ); }
    else { $paged = 1; }
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array(
      'numberposts' => 4 ,
      'category_name'=> 'Allgemein',
      'post_status' => 'publish, future',
      'order'=> 'DEC',
      'orderby'=> 'date',
      'paged'=> $paged
    );
    
    $the_query = new WP_Query( $args ); 
    $myposts = get_posts( $args );
    foreach ($myposts as $post) : setup_postdata($post);?>
    <?php the_content(); ?> <?php endforeach; ?>
    
    <div><?php the_posts_pagination( array(
        'mid_size' => 4,
         
        'prev_text' => __( '←', 'textdomain' ),
        'next_text' => __( '→', 'textdomain' ),
    ) ); ?></div>

    Im Augenblick bin ich Ratlos und wäre für Hilfe dankbar.

    PS:Den Post_Status Future habe ich in den Funktions als „show_future_posts“ sichtbar geschaltet, weil ich einen bestimmten Eintrag immer zuerest anzeigen möchte.

Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)
  • Hallo,
    Fragen zur Programmierung solltest du eher auf https://wordpress.stackexchange.com/ stellen. Wir klären hier im Forum in erster Linie Fragen zur Anwendung von WordPress.

    Außerdem noch ein allgemeiner Hinweis: Ohne Angabe der URL und des Berichts können wir dir nicht helfen. Lies bitte auch noch mal: Bevor du ein neues Thema (Thread) erstellst.

    Viele Grüße
    Hans-Gerd

    Der Code ist auch etwas wirr.

    Mit

    if ( get_query_var( 'paged' ) ) { $paged = get_query_var( 'paged' ); }
    elseif ( get_query_var( 'page' ) ) { $paged = get_query_var( 'page' ); }
    else { $paged = 1; }

    setzt du eine Variable $paged, die du anschließend mit

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

    wieder überschreibst?

    Dann startest du mit $the_query = new WP_Query( $args ); eine neue Datenbankabfrage der Posts … die du aber nie verwendest? Statt dessen verwendest du $myposts = get_posts( $args ); mit den gleichen Argumenten.

    Bei den Argumenten verwendest du numberposts – warum möchtest du hier die maximale Anzahl von Beiträgen vorgeben, wenn du anschließend deine Anzahl der Beiträge in Einstellungen > Lesen kontrollierst?

    Und welche Übersetzung erwartest du bei 'prev_text' => __( '←', 'textdomain' ),?

    Thread-Starter treibstoff

    (@treibstoff)

    Der Entscheidende Hinweis zur Lösung meines Problems kam vom Moderator des englischen WP Forum: pre_get_posts war mir noch nicht bekannt.

    Die Lösung dann mit dieser Funktion:

    function numberposts_for_index( $query ) {
    if( $query->is_main_query() && ! is_admin() && $query->is_home() ) {
    $query->set( 'posts_per_page', '4' );
    $query->set('post_status','future,publish');
    }}
    add_action( 'pre_get_posts', 'numberposts_for_index' );

    und auf der Index.php jetzt:

    <?php 
    if(have_posts()) :
        while(have_posts())  : the_post();?>
    <?php the_content('<br />→ weiterlesen …'); ?>
    <?php endwhile; ?>
    <div><?php the_posts_pagination( array(
        'mid_size' => 4,
        'prev_text' => __( '←', 'neuere Beiträge' ),
        'next_text' => __( '→', 'ältere Beiträge' ),
    ) ); ?></div><p>&nbsp;</p>
            <?php else :?>
    <h3><?php _e('404 Error: Not Found', ''); ?></h3>
    <?php endif; ?>
    <?php wp_reset_postdata();?>

    und für Interessierte:

    „Nearly everyone has pagination issues with custom queries (including get_posts()) on templates on their initial foray into subject. This is compounded with a lot of bad examples on the internets. The issues introduced are not readily apparent.

    The only pagination function that really works with custom queries is paginate_links(). All other functions assume you want to paginate the requested page and not the queried posts.

    Even with paginate_links(), you still run into trouble by trying to use the “paged” query var. It rightly belongs to the main query and not your custom query. Trying to usurp it for your own means does not work very well. IMO you’re better off introducing your own pagination query var to avoid any confusion and cross talk between queries.

    Better yet, don’t do custom queries on a template if those results are going to be the only queried content on the page. Instead, alter the main query through the “pre_get_posts” action so it returns the results your custom query would have returned. Then there’s no need for another query, and WP handles pagination for you. Then most pagination functions will work as intended and you don’t have to use paginate_links(), though it would still work.“

    • Diese Antwort wurde geändert vor 1 Jahr, 8 Monaten von treibstoff. Grund: Korrektur
    • Diese Antwort wurde geändert vor 1 Jahr, 8 Monaten von Hans-Gerd Gerhards.

    Hallo,
    sorry, die Forensoftware hat deinen Beitrag als Spam eingeordnet und nicht automatisch frei gegeben. Danke für die Info.

    Da das hier ein deutschsprachiges Forum ist, nachfolgend die Übersetzung:
    „Fast jeder hat Probleme bei der Paginierung mit benutzerdefinierten Abfragen (einschließlich get_posts()) auf Templates auf ihrem ersten Streifzug durch das Thema. Dies wird durch eine Menge schlechter Beispiele im Internet verstärkt. Die eingeführten Probleme sind nicht ohne weiteres ersichtlich.

    Die einzige Paginierungsfunktion, die wirklich mit benutzerdefinierten Abfragen funktioniert, ist paginate_links(). Alle anderen Funktionen gehen davon aus, dass Sie die angeforderte Seite paginieren wollen und nicht die abgefragten Beiträge.

    Selbst mit paginate_links() können Sie Probleme bekommen, wenn Sie versuchen, die Abfragevariable „paged“ zu verwenden. Sie gehört zu Recht zur Hauptabfrage und nicht zu Ihrer benutzerdefinierten Abfrage. Der Versuch, sie für Ihre eigenen Zwecke zu missbrauchen, funktioniert nicht sehr gut. IMO ist es besser, wenn Sie eine eigene Abfragevariable für die Paginierung einführen, um Verwirrung und Überschneidungen zwischen Abfragen zu vermeiden.

    Besser noch, machen Sie keine benutzerdefinierten Abfragen auf einer Vorlage, wenn diese Ergebnisse die einzigen abgefragten Inhalte auf der Seite sein werden. Ändern Sie stattdessen die Hauptabfrage durch die Aktion „pre_get_posts“ so, dass sie die Ergebnisse Ihrer benutzerdefinierten Abfrage zurückgibt. Dann ist keine weitere Abfrage erforderlich, und WP übernimmt die Paginierung für Sie. Dann funktionieren die meisten Paginierungsfunktionen wie vorgesehen und Sie müssen paginate_links() nicht verwenden, obwohl es trotzdem funktionieren würde.“

    Übersetzt mit http://www.DeepL.com/Translator (kostenlose Version)

    Viele Grüße
    Hans-Gerd

    Prima. Dann markiere ich den Thread jetzt als „gelöst“.

Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)
  • Das Thema „Pagination zeigt nicht alle Beiträge auf Index.php“ ist für neue Antworten geschlossen.