Вопрос

Я нашел почти тот же вопрос: 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 ();

в начале виджета

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top