запрос сообщений() ВСЕГДА что-то отображает?
Хорошо, я использую 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');
2 answers
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');
Происходит ли то же самое, если вы используете the_post()
без , в то время как цикл? Происходит ли то же самое, если вы не используете пользовательский вызов query_posts()
?
Это ужасно похоже на плохо закодированный фильтр где-то в цепочке, но по нему трудно угадать местоположение.
Вы можете попробовать этот код для сброса имен фильтров по мере их выполнения и попытаться определить, что может вызвать это:
add_filter('all','dump_name',10,0);
function dump_name() {
var_dump(current_filter());
}