wordpressor
  • 0
Эксперт

Query_posts() ВСЕГДА что-то отображает?

  • 0

Хорошо, я использую posts_query() для отображения сообщений.

Проблема в том, что, по крайней мере в моем случае, posts_query() всегда что-то выводит.

Например:

<?php

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    query_posts("posts_per_page=1&paged=$paged");
    global $more;
    $more = 0;

    while ( have_posts() ) : the_post(); ?>    
        <!--- DO NOTHING ! -->
    <?php endwhile ?>

Отображает необработанную первую часть поста (и без $more = 0 весь пост).

Почему это происходит?

Я хочу оформить вывод самостоятельно, но не могу, потому что, например:

while ( have_posts() ) : the_post(); ?>    
         <h1><?php the_title();?></h1>
         <h3><?php the_content( __( '') ); ?></h3>
<?php endwhile ?>

Дает:

<h1>MyTitle</h1>
<h3>something something something something something</h3>
<p>something something something something something</p> <!-- (wherethis line comes from? ;/) ?>

PS.

Кроме того, я почти уверен, что нумерация страниц тоже не работает, и я считаю, что так и должно быть? У меня есть около 15 сообщений для отображения, я выбрал 1, почему нет навигации? 🙁

Точный код:

function posts_shortcode( $atts ) {
     extract( shortcode_atts( array(
        ), $atts ) );  

        query_posts("posts_per_page=1");
        global $more;
        $more = 0;

        while ( have_posts() ) : the_post(); ?>    
         <h1><?php the_title();?></h1>
         <h3><?php the_content( __( '') ); ?></h3>
         <?php endwhile;
}

add_shortcode('posts', 'posts_shortcode');  
Share
  1. query_posts() ВСЕГДА что-то отображает?

    Нет, по крайней мере, не для меня, я попробовал код, который вы разместили в моей дочерней теме, и не смог воспроизвести описанную проблему.

    Во-первых, я пытался…

    while ( have_posts() ) : the_post(); ?>    
        <!--- DO NOTHING ! -->
    <?php endwhile ?>
    

    .. и ничего не получил, поэтому я проверил..

    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    query_posts("posts_per_page=1&paged=$paged");
    global $more;
    $more = 0;
    
    while ( have_posts() ) : the_post(); ?>    
             <h1><?php the_title();?></h1>
             <h3><?php the_content( __( '') ); ?></h3>
    <?php endwhile ?>
    

    ..который произвел..

    <h1>Post title</h1>
    <h3><p>post content</p></h3>
    

    Нет случайных абзацев контента.

    Если бы мне пришлось угадывать проблему, я бы сказал, что это плохо закодированный фильтр или шорткод. Самый простой способ локализовать причину (как и при любом устранении неполадок WP) — отключить плагины и/или переключить тему и сузить круг причин, вызывающих проблему.

    ОБНОВЛЕНИЕ:
    используйте новый WP_Query объект вместо query_posts и это должно решить проблему.

    function posts_shortcode( $atts ) {
        extract( shortcode_atts( array(
        ), $atts ) );  
        global $more, $wp_query;
        $args = array( 
          'posts_per_page' => 1,
          'paged' => get_query_var('paged')
        );
        $q = new WP_Query;
        $q->query( $args );
    
        // Backup $wp_query
        $backup = $wp_query;
        // Fill $wp_query with the custom query
        $wp_query = $q;
    
        // Do the loop
        while ( $q->have_posts() ) : 
          $q->the_post(); 
          $more = 0;
        ?>    
    
        <h1><?php the_title();?></h1>
        <h3><?php the_content( __( '') ); ?></h3>
    
        <?php 
        endwhile;
    
        // Output page navi
        wp_pagenavi();
    
        // Restore $wp_query
        $wp_query = $backup;
    
        // Restores wp_query global and also resets postdata(may not be needed, but won't hurt)
        wp_reset_query(); 
    }
    
    add_shortcode('posts', 'posts_shortcode'); 
    
    • 0
    • @ t31os, хорошо, тогда я собираюсь исследовать свою тему, приведенный выше код query_posts () является частью шорткода в файле functions.php. Других петель вокруг нет, и в этом проблема. edit отключение всех виджетов и плагинов не помогло, все еще ищу. [edit2] Удаление всех других шорткодов из functions.php также ничего не меняет.

      • 0
    • @Wordpressor — Знаете, на самом деле это должно работать, если вы используете его на странице без страниц, т.е. страница с содержимым, которое не распределено между страницами. Добавление 'paged' => get_query_var('paged') внутри массива args работает для меня при тестировании шорткода на странице.

      • 0
    • Добавил, хотя это именно то, что я разместил в моем последнем комментарии. Если у вас возникли проблемы, подскажите, куда вы добавляете шорткод (внутри страницы/записи/пользовательского типа).

      • 0
    • А, значит, проблема была не в том, что пейджинг не работал, просто ссылки пейджинга не появлялись, верно? Вы всегда можете протестировать вручную, просто добавив переменную выгружаемого запроса в URL-адрес, например. example.com/some-page-name/page/2 . Скоро пойду спать, но я придумаю что-нибудь, чтобы решить эту проблему для вас завтра (моей непосредственной мыслью было бы сделать ссылки на страницы внутри шорткода и использовать небольшое жонглирование переменными, чтобы обмануть разбиение на страницы, но я’ завтра надо подумать)

      • 0
    • Обновленный ответ, просто нужно обмануть навигацию по страницам, $wp_query временно заполнив и восстановив ее после печати ссылок на страницы. Надеюсь, это поможет.

      • 0
  2. Происходит ли то же самое, если вы используете the_post() без цикла while ? Происходит ли то же самое, если вы не используете пользовательский query_posts() вызов?

    Это ужасно похоже на плохо закодированный фильтр где-то в цепочке, но по этому трудно угадать местоположение.

    Вы можете попробовать этот код, чтобы вывести имена фильтров во время их работы и попытаться точно определить, что может вызвать это:

    add_filter('all','dump_name',10,0);
    
    function dump_name() {
    
        var_dump(current_filter());
    }
    
    • 0

Оставить ответ

You must login to add an answer.