Post_type не работает для виджетов?
-
16-10-2019 - |
Вопрос
Я нашел почти тот же вопрос: https://stackoverflow.com/questions/4796165/multiple-loops-inwordpress-second-loop-not-resetting Но ответ не работает для меня.
У меня есть тип поста «портфолио», и я работаю над виджетом, отображающим все элементы портфеля.
Этот код отлично работает на странице-портфель:
$loop = new WP_Query( array(
'post_type' => 'portfolio',
'posts_per_page' => 5 ) );
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
(...)
<?endwhile?>
Но когда я реализую это в своих виджетах - поле «post_type», похоже, не работает. Независимо от того, что я печатаю как тип поста - он всегда отображает посты вместо портфолио. Даже если тип поста даже не существует (и, как мы все знаем, он ничего не должен отображать, если нет такого типа поста!).
Я считаю, что проблема не связана с моим виджетом, есть раздел блога (цикл от loop.php, нет кода, чтобы показать, потому что есть только "while (haf_posts ()): the_post ();")
редактировать
Я могу ошибаться, удалил каждую строку кода из loop.php, и мой виджет все еще показывает посты.
Есть идеи, как это исправить?
Редактировать № 2
Хорошо, так что мой сайт выглядит так же, как каждый обычный блог WordPress:
header.php
loop.php > widget area
footer.php
В заголовке и нижнем колонне практически нет кода PHP (по крайней мере, нет петли и т. Д.).
The Loop.php также я бы сказал: нормально:
<?php if ( ! have_posts() ) : ?>
(...)
<?php endif; ?>
<?php while ( have_posts() ) : the_post(); ?>
(...)
<?php endwhile; ?>
На самом деле виджет также не очень уникален:
function myWidgetName_load_widgets() {
register_widget( 'myWidgetName' );
}
class myWidgetName extends WP_Widget {
function myWidgetName() {
(...)
}
function widget( $args, $instance ) {
extract( $args );
$title = apply_filters('widget_title', $instance['title'] );
$number = $instance['number'];
echo $before_widget;
if ( $title )
echo $before_title . $title . $after_title;
if ( $number )
echo "<ul>"; ?>
<?php
$loopWithSuperUniqueName = new WP_Query( array(
'post_type' => 'anything', /* and this doesn't work */
'posts_per_page' => 15 ) );
?>
<?php while ( $loopWithSuperUniqueName->have_posts() ) : $loopWithSuperUniqueName->the_post(); ?>
<p><?php the_title(); ?></p> /* it always displays POSTS even if 'post_type' => 'alalaaolbadiobladaWhathever' */
<?php endwhile; ?>
<?php echo "</ul>"; ?>
<?php
echo $after_widget;
}
function update( $new_instance, $old_instance ) {
(...)
}
function form( $instance ) {
(...)
}
etc.
Код виджета в порядке, потому что я разработал несколько подобных виджетов, и они работают.
Я начинаю думать, что что -то не так с WordPress, а не с моим кодом.
Решение
Похоже, что ваш виджет ссылается на Global $ Loop по какой -то причине. Это может быть связано с внутренним классом виджетов или из -за вмешательства других плагинов, я полагаю.
В качестве первого шага, чтобы быть на безопасной стороне, попробуйте использовать другое имя переменной. Глобальный цикл называется $ Loop, просто переименовавшись в $ myloop, вы можете избежать любых путаников между глобальным и местным.
Во -вторых, если проблема сохраняется, проверьте свой виджет на странице типа «страница». Или любая другая страница «одиночка». Это показывает только один ряд сейчас?
Другие советы
Я мог бы решить эту проблему с помощью wp_reset_query ();
в начале виджета