Нет другого способа выразить это: как я могу использовать Цикл? - PullRequest
0 голосов
/ 19 ноября 2018

Я прошу прощения за этот пост так долго.ПРИЧИНА, по которой я задаю такой глупый вопрос, как предполагает тема, заключается в том, что из-за того, что происходит так много разных проблем, мне нужно предоставить подробную информацию ПОЧЕМУ я задаю этот вопрос.

Пожалуйста потерпите меня ...

Я занят созданием собственной темы для личного использования, у меня МНОГО страниц на основе слагов, и я много использую WP_query (!) Для многих вещей, от настраиваемого новостного тикера до процедурной генерации моей панели навигации, чтобы упомянуть лишь некоторые из них.

У меня сложилось впечатление, что создание собственного WP_Query означает содержимое внутри результатовне будет мешать работе основного цикла, и все же я получаю очень странное поведение ...

Все мои пользовательские страницы на основе слагов всегда отлично работают, но когда я использую это в моей части шаблона navagation.php:

$query = new WP_Query($args);
if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
//do my stuff here
endwhile; endif;

... это приводит к тому, что страницы и сообщения загружаются очень хорошо во время цикла, но когда я попадаю на продукт, я пытаюсь просмотреть его, всегда показывает одно и то жене важно, по какой ссылке я перехожу.В конце концов я добавил это на страницу продукта:

if (have_posts()) {
    the_post();
    rewind_posts();
}

... и это заставило продукты загружаться очень хорошо.Йеай!Понятия не имею, ПОЧЕМУ я должен это сделать, но это работает.Как ни странно, однако, в шаблоне, непосредственно перед тем, как он загружает часть шаблона, которая делает макет продукта, я печатаю название поста, который в данный момент находится в глобальном $ post, и затем наблюдаю, как он печатает неправильное имя над нужным продуктом после запуска.петля.(!?)

Итак, я узнаю о get_posts (), и мне нравится тот факт, что он дает мне массив, а не объект, который содержит массив, и поэтому я перехожу к использованию get_posts () в моемЧасть шаблона заголовка navigation.php, и теперь мой раздел заголовка по-прежнему работает отлично, и мои продукты отображаются отлично ... но все сообщения и страницы теперь показывают одинаковое содержание.Все сообщения и страницы теперь показывают один и тот же продукт WooCommerce.(!?) Что еще более запутанно, так это то, что я делаю 3 вызова WP_Query в navigation.php, и цикл в моих сообщениях и на всех страницах показывает первую запись из первого запроса, а не последнюю ...

Через многоизо всех сил я решил, что это не стоит ухудшения, поэтому я вернулся к использованию WP_Query.Теперь все запутано так, что я даже не могу понять ... Теперь мои публикации и страницы работают отлично (как и мое пользовательское меню), но все мои продукты теперь показывают один и тот же продукт, пока находятся в цикле.Я попытался сделать это:

global $post;
$current = $post;
//do my query and loop over it
$post = $current;

Каким-то образом этот код превращает $ post (который является просто указателем на массив) в сам массив (или что-то), потому что шаблон продукта теперь сначала отображает тот же продукт нана каждой странице, на которую я захожу, и затем на ней отображается $ post-продукт, который должен был находиться прямо под ним.Если я установлю $ post в null сразу после того, как установлю $ current, то после установки $ post обратно в $ current впоследствии будет отображаться только неправильная страница.

Каким-то образом мне удалось заставить его перестать показывать неправильный продукт итеперь вместо этого работают только мои страницы на основе слагов, потому что все, что использует цикл (post, page и product), просто говорит мне следующее:

Fatal error: Uncaught Error: Cannot use object of type WP_Query as array in D:\xampp\wordpress\htdocs\wp-includes\class-wp-query.php:3071 Stack trace: #0 D:\xampp\wordpress\htdocs\wp-includes\class-wp-query.php(3099): WP_Query->next_post() #1 D:\xampp\wordpress\htdocs\wp-includes\query.php(805): WP_Query->the_post()  

.. и отслеживание трассировки стека в том месте, где это происходит, кажетсячтобы указать, что (очевидно) я пытаюсь использовать WP_query в качестве массива, когда говорю это во время цикла:

if (have_posts()) : while (have_posts()) : the_post()

Как ЭТО код неправильный?Это прямо из руководства!: O Согласно Кодексу, хотя get_posts () также использует WP_Query, он позволяет вам иметь несколько циклов и говорит, что вы должны использовать restore_post_data () (я думаю) IF вы обновили основное содержимое цикла,Но я НЕ пытаюсь изменить основной цикл вообще.Я хочу сделать запрос, получить результаты в переменной, выполнить этот результат, а затем отбросить переменную, прежде чем войти в цикл и показать содержимое страницы как обычно.Я хочу, чтобы мои запросы выполнялись независимо от цикла и никоим образом не мешали работе цикла.

Итак:

  • почему, черт возьми, мои пользовательские вызовы WP_Query мешают тому, что я вижу в цикле, и
  • , почему, черт возьми, я получаю ошибку при попытке передать объект WP_Query в виде массива при вызове по умолчанию,vanilla Loop
  • почему мои продукты отображаются правильно, но мои сообщения и страницы не отображаются
  • или почему мои сообщения и страницы отображаются правильно, в то время как мои продукты показывают два разных продукта

Как, черт возьми, мой полнофункциональный сайт может сломать ЭТО, просто перейдя от $ posts = get_posts ($ args) к $ query = new WP_Query ($ args) ????В отдельную работу полностью вне цикла, не меньше!

Это не имеет абсолютно никакого смысла, и поскольку это не имеет никакого смысла, я понятия не имею, с чего начать при попытке внедрить исправление.Так чего я здесь не вижу?перемотка сообщений, восстановление данных сообщений ... ничего не помогает.Я совершенно ошеломлен.

Правильно ли я использую петлю?Все, что я хочу сделать, это:

  1. Загрузить страницу, которая выполняет пользовательский WP_query и отображает содержимое
  2. Загрузить часть шаблона, которая выполняет цикл (т. Е. Один продукт)
  3. Отобразите часть шаблона , которая загружает страницу (т.е. content-single-product) и должна иметь значение right content

Это не должноне так ли сложно, правда?

1 Ответ

0 голосов
/ 19 ноября 2018

Такая простая мелочь, чтобы вызвать такое огромное количество горя ... :( Внутри моей части шаблона навигации, когда я переключился с get_posts () на WP_Query, я сохранил один запрос в $ posts, а другой - в $ query. Кажется, $ posts - это зарезервированная переменная в WordPress, потому что в тот момент, когда я изменил $ posts на $ query, все снова заработало на 100%!

Я знал о $ post, но не $ posts. Теперь я знаю. Отдельное спасибо @zipkundan за указание на wp_reset_postdata (). На этой странице я узнал, что пользовательские запросы действительно влияют на глобальный цикл («Новости для меня!»), И показал, как его обойти.

Так что, в основном, проблема с тем, что мои сообщения не показывают то, что они должны были, была из-за того, что я не вызывал wp_reset_postdata () после выполнения моего пользовательского цикла, а причина всех необъяснимых странных аномалий страниц была в том, что я сохранил свой пользовательский запрос к зарезервированному имени переменной.

Тайна раскрыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...