it-swarm.com.de

Sticky Posts überschreiten das Seitenlimit

Ich verwende pre_get_posts, um die Anzahl der auf meiner Homepage angezeigten Beiträge anzupassen.

function lifelounge_query_adjust( $query ) {
    if ( is_home() ) {
        set_query_var( 'posts_per_page', 12 );
        return;
    }
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );

Aber ich habe ein Problem mit klebrigen Beiträgen. Grundsätzlich werden in der Abfrage bei klebrigen Beiträgen mehr als die von mir angegebenen 12 Beiträge angezeigt, da dort 12 plus alle klebrigen Beiträge angezeigt werden. Ich könnte natürlich auch klebrige Beiträge ignorieren:

function lifelounge_query_adjust( $query ) {
    if ( is_home() ) {
        set_query_var( 'posts_per_page', 1 );
        set_query_var( 'ignore_sticky_posts', 1 );
        return;
    }
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );

Aber ich halte das nicht für ideal. Ich denke, die Haftnotizen sollten enthalten sein im Limit von 12 Notizen und nicht hinzugefügt zum Limit. Das macht für mich am meisten Sinn. Gibt es einen Weg, das zu erreichen? Habe ich einen Fehler gemacht, der Gesichtspalmen würdig ist?

Ziemlich genau ein Duplikat von: Sticky Posts & Posts pro Seite , aber das wurde seltsamerweise als zu lokalisiert geschlossen. Ich bin nicht einverstanden, offensichtlich, weil ich nach einer Antwort suche, aber auch, weil es eine Frage ist, warum WordPress den posts_per_page limit nicht zu respektieren scheint, wenn Sie klebrige Beiträge verwenden. Wenn Sie 12 Posts pro Seite haben möchten, sollten Sie 12 erhalten, nicht 13, was Sie erhalten würden, wenn Sie einen einzelnen klebrigen Post hätten.

21
helgatheviking

Hier ist ein Ansatz zur Berücksichtigung von Haftnotizen, indem die Anzahl der Haftnotizen (falls vorhanden) ermittelt und diese in den Berechnungsparameter posts_per_page einbezogen werden:

add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {

    if ($query->is_main_query() && is_home()) {

        // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {

            // counnt the number of sticky posts
            $sticky_count = count($sticky_posts);

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
                $query->set('posts_per_page', $posts_per_page - $sticky_count);

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set('posts_per_page', 1);
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    }
}

Bearbeiten

In dem Fall, in dem die Anzahl der Posts pro Seite, die wir festlegen möchten, kleiner oder gleich der Anzahl der Sticky-Posts ist, habe ich den posts_per_page auf eins gesetzt und dies führt dazu, dass 13 oder mehr Posts $sticky_count + 1 (in diesem Fall) nur am angezeigt werden Die erste Seite (die folgenden Seiten haben 12 Beiträge). Vielleicht ist das in Ordnung, da dieser Fall selten vorkommt und ein Beitrag auf der ersten Seite möglicherweise nicht so aussagekräftig ist.

Dies liegt daran, dass Wordpress alle Haftnotizen zuerst und auf einer Seite (der ersten Seite) anzeigt, auch wenn die Anzahl der Haftnotizen größer als der Parameter posts_per_page ist. Daher setzen wir den posts_per_page in diesem Fall auf die minimal mögliche Menge, nämlich 1, weil 0 und Durch negative Werte wird der Parameter posts_per_page deaktiviert und Wordpress zeigt alle Beiträge auf der ersten Seite an.

12
Ahmad M

Es gibt ein Problem, wenn die Haftnotizen auf der ersten Seite sind.

Die Lösung besteht darin, die Anzahl der Haftnotizen für die Haftnotizen, die Teil der ersten Seite sind, zu verringern.

function fix_posts_per_page_with_sticky_posts( $query ) {

    if ( $query->is_main_query() ) {

        // set the number of posts per page
        $posts_per_page = 12;

        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // get queried post ids array
        $ids = array();
        $args = array(
            'post_type' => 'post',
            'post_per_page' => $posts_per_page,
            'paged' => 1
        );

        $posts = get_posts( $args );

        foreach ( $posts as $post ) {
            $ids[] = $post->ID;
        }

        // if we have any sticky posts and we are at the first page
        if ( is_array( $sticky_posts ) && ! $query->is_paged() ) {

            // count the number of sticky posts
            $sticky_count = count( $sticky_posts );

            foreach ( $sticky_posts as $sticky_post ) {
                if ( in_array( $sticky_post, $ids ) ) {
                    // decrement sticky posts count if the sticky post in on the page
                    $sticky_count--;
                }
            }

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ( $sticky_count < $posts_per_page ) {
                $query->set( 'posts_per_page', $posts_per_page - $sticky_count );

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set( 'posts_per_page', 1 );
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set( 'posts_per_page', $posts_per_page );
        }
    }
}
add_action( 'pre_get_posts', 'fix_posts_per_page_with_sticky_posts'  );

Ich hoffe es wird helfen

3
csag

Ich habe beide oben genannten Antworten zu einer bereinigt, damit keine unnötigen WP_Query geladen werden. Behebt, ob die erste Seite klebrig ist, und verkürzt die Zeit für die Verarbeitung der Informationen mit saubererem, schnellerem Code.

function modify_main_query( $query ) {
   if ( ( $query->is_home() || is_front_page() ) && $query->is_main_query() ) {
         // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );
        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {
            // make a second query to make sure the sticky posts will still work 
            // correctly when on the first page
            // Only reply with the ID's as that is all that is needed
            $args = [
                'post_type' => 'post',
                'post_per_page' => $posts_per_page,
                'paged' => 1,
                'fields' => 'ids'
            ];
            // Array flip to reduce the time taken by 
            // using isset and not in_array
            $posts = array_flip( get_posts( $args ) );

            // count the number of sticky posts
            $sticky_count = count($sticky_posts);

            // loop the posts from the 2nd query to see if the ID's of the sticky posts
            // sit inside it.
            foreach ( $sticky_posts as $sticky_post ) {
                if(isset($posts[$sticky_post])){
                    $sticky_count--;
                }
            }
            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
               $query->set('posts_per_page', $posts_per_page - $sticky_count);
            } else {
                // if the number of sticky posts is greater than or equal
                // the number of pages we want to set:
                $query->set('posts_per_page', 1);
            }
        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    } 
}

add_action( "pre_get_posts", 'modify_main_query' );
0
Andrew Killen