Postagens fixas excedem as postagens por limite de página

20

Estou usando pre_get_posts para ajustar o número de postagens exibidas na minha página inicial.

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

Mas estou com um problema com postagens fixas. Basicamente, se eu tiver postagens fixas, a consulta exibirá mais do que as 12 postagens que eu especifiquei, porque exibirá 12 mais quaisquer postagens fixas. Eu poderia, claro, ignorar postagens fixas:

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' );

Mas eu não acho que isso seja ideal. Acho que os posts fixos devem ser incluídos no limite de 12 postagens, e não adicionados ao limite. Isso é o que faz mais sentido para mim. Existe uma maneira de conseguir isso? Eu cometi um erro digno de palmas?

Mais ou menos uma cópia de: Posts & Postagens por página , mas isso foi estranhamente fechado por estar muito localizado. Eu discordo, obviamente porque estou procurando uma resposta, mas também porque é uma questão de por que o WordPress não parece respeitar o posts_per_page limite se você estiver usando posts fixos. Se você quiser 12 postagens por página, você deve obter 12, não 13, que é o que você obteria se tivesse um único post fixo.

    
por helgatheviking 19.12.2012 / 17:00
fonte

3 respostas

11

Aqui está uma abordagem para contabilizar postagens fixas, obtendo o número de postagens fixas (se houver) e incluindo isso no parâmetro posts_per_page do cálculo:

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

Editar

No caso em que o número de postagens por página que desejamos definir é menor ou igual ao número de postagens fixas, defini o posts_per_page como um e isso resultará em 13 ou mais postagens $sticky_count + 1 (neste caso) apenas na primeira página (páginas subseqüentes terão 12 posts). Talvez esteja tudo bem, já que este caso é raro e o +1 na primeira página pode não ser tão significativo.

Isso ocorre porque o Wordpress exibirá todas as postagens fixas primeiro e em uma página (a primeira página), mesmo que sua contagem seja maior que o parâmetro posts_per_page , portanto, definimos posts_per_page para o mínimo possível que é 1 , porque 0 e valores negativos desativarão o parâmetro posts_per_page e isso fará com que o Wordpress exiba todas as postagens na primeira página.

    
por Ahmad M 19.12.2012 / 20:07
fonte
3

Existe um problema se as postagens persistentes estiverem na primeira página.

A solução é diminuir a contagem de postagens fixas para as postagens fixas que fazem parte da primeira página.

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'  );

Espero que ajude

    
por csag 28.11.2014 / 15:49
fonte
0

Eu limpei ambas as respostas acima em uma para que ela não carregasse desnecessariamente WP_Query, corrige se o pegajoso na primeira página, reduz o tempo para processar as informações com um código mais rápido e limpo.

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' );
    
por Andrew Killen 01.08.2018 / 09:59
fonte