webentwicklung-frage-antwort-db.com.de

Ändern von Posts pro Seite und Versetzen mit pre_get_posts

Ich habe einen Filter, der pre_get_posts verwendet, um die Anzahl der Beiträge pro Seite von 4 auf der Nachrichten-Zielseite auf 8 auf allen anderen Seiten (Seite 2, 3 usw.) zu ändern. Allerdings scheint der Offset nicht korrekt zu sein, oder so, weil mein get_next_posts_page_link keine Seite 3 anzeigt, obwohl er existiert, wenn ich manuell zur URL gehe. Der aktuelle Versatz ist etwas, das ich irgendwie aus Versehen hervorgerufen habe. Ich dachte, dass er funktioniert hat, da Seite 2 korrekt ist. Als ich jedoch weitere Testbeiträge hinzufügte, stellte ich fest, dass er nicht funktioniert hat.

function page_2_posts_per_page_filter( $query ) {

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

    if ( !is_admin() && $query->is_paged && $query->is_main_query() ) {

        $offset = 4 + (($paged - 2) * 8);
        $query->set( 'offset', $offset );
        $query->set( 'posts_per_page', 8 );

    } else if (!is_admin() && $query->is_main_query()) {

        $query->set( 'posts_per_page', 4 );

    }
    return;
}
add_action( 'pre_get_posts', 'page_2_posts_per_page_filter', 1 );

EDIT: LÖSUNG

function page_2_posts_per_page_filter( $query ) {

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

    if ( !is_admin() && $query->is_paged && $query->is_main_query() ) {

        $offset = (($paged - 1) * 8) - $offset;
        $query->set( 'posts_per_page', 8 );
        $query->set( 'offset', $offset );

    } else if (!is_admin() && $query->is_main_query()) {

        $query->set( 'posts_per_page', 4 );

    }
    return;
}
add_action( 'pre_get_posts', 'page_2_posts_per_page_filter');

function found_offset( $found_posts, $query ) {

    $offset = 4;

    if( !is_admin() && $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}
add_action( 'found_posts', 'found_offset', 10, 2 );
3
evu

Hier ist eine Antwort, die ich kürzlich auf eine andere Frage gegeben habe, die gleiche wie Ihre. Da die Antwort nie positiv bewertet oder akzeptiert wurde, konnte ich diese Frage nicht als Duplikat markieren. Daher habe ich die Antwort in dem anderen Beitrag gelöscht und sie hier erneut veröffentlicht.

Bitte beachten Sie, dass einige Punkte nicht auf dieses Problem abzielen und ignoriert werden können. Außerdem müssen Sie nur einige Änderungen an den Werten vornehmen, da ich im ursprünglichen Beitrag nichts geändert habe. Lass dich also nicht von den Informationen in der Antwort beunruhigen ;-)

UMGEWANDELTE ANTWORT

Hier ist eine kleine Variation einer Antwort, die ich über das gleiche Szenario gemacht habe. Was hier anders ist, ist, dass Sie weniger posts_per_page auf Seite eins wollen

SCHRITT 1

Entfernen Sie query_posts . Du solltest niemals query_posts verwenden

Hinweis: Diese Funktion ist nicht für Plugins oder Themes vorgesehen. Wie später erläutert, gibt es bessere, leistungsfähigere Optionen zum Ändern der Hauptabfrage. Mit query_posts () kann die Hauptabfrage einer Seite übermäßig vereinfacht und problematisch geändert werden, indem sie durch eine neue Instanz der Abfrage ersetzt wird. Es ist ineffizient (führt SQL-Abfragen erneut aus) und schlägt unter bestimmten Umständen (besonders häufig bei Seitenumbrüchen) fehl.

Ersetzen Sie es durch die Standardschleife

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    <?php if ( 'regularproducts' == get_post_type()  ) : ?>

        //CONTENT HERE

    <?php endif; ?>

    <?php if ( 'wpsc-product' == get_post_type()  ) : ?>

        //CONTENT HERE

    <?php endif; ?>

<?php endwhile; endif; ?>

SCHRITT 2

Verwenden Sie pre_get_posts, um die Hauptabfrage zu ändern und Ihre benutzerdefinierten post_types zur Hauptabfrage hinzuzufügen, die auf der Homepage angezeigt werden soll.

SCHRITT 3

Holen Sie sich jetzt die Option posts_per_page aus dem Back-End (die auf 300 gesetzt werden sollte) und setzen Sie auch Ihre offset, die wir verwenden werden. Das wird 200 sein, da Sie 100 Posts auf Seite eins und 300 auf dem Rest benötigen.

Wenn Sie die Option posts_per_page nicht ändern möchten, können Sie einfach die Variable $ppg auf 300 setzen.

$ppg = get_option( 'posts_per_page' );
//$ppg = 300;
$offset = 200;

SCHRITT 4

Auf Seite eins müssen Sie die offset zu posts_per_page subtrahieren

$query->set( 'posts_per_page', $ppp - $offset );

SCHRITT 5

Sie müssen Ihre offset auf alle nachfolgenden Seiten anwenden, andernfalls wird der letzte Beitrag der Seite auf der nächsten Seite wiederholt

$offset = ( ( $query->query_vars['paged']-1 ) * $ppp ) - $offset;
$query->set( 'posts_per_page', $ppp );
$query->set( 'offset', $offset ); 

SCHRITT 6

Zuletzt müssen Sie Ihren Versatz zu found_posts hinzufügen, sonst zeigt Ihre Paginierung nicht die letzte Seite an

HINWEIS: Dieser Code hat die Paginierung auf der Suchseite verletzt. Dies ist jetzt behoben, siehe den aktualisierten Code.

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 200;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

ALLES ZUSAMMEN

So sieht Ihre vollständige Abfrage aus, die in die Datei functions.php eingeht

function tax_and_offset_homepage( $query ) {
  if ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
    $query->set( 'post_type', array( 'regularproducts', 'wpsc-product' ) );

    $ppp = get_option( 'posts_per_page' );
//$ppp = 300;
    $offset = 200;
    if ( !$query->is_paged() ) {
      $query->set( 'posts_per_page', $ppp - $offset );
    } else {
      $offset = ( ( $query->query_vars['paged']-1 ) * $ppp ) - $offset;
      $query->set( 'posts_per_page', $ppp );
      $query->set( 'offset', $offset );
    }
  }
}
add_action('pre_get_posts','tax_and_offset_homepage');

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 200;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );
5
Pieter Goosen