Я прошу прощения за этот пост так долго.ПРИЧИНА, по которой я задаю такой глупый вопрос, как предполагает тема, заключается в том, что из-за того, что происходит так много разных проблем, мне нужно предоставить подробную информацию ПОЧЕМУ я задаю этот вопрос.
Пожалуйста потерпите меня ...
Я занят созданием собственной темы для личного использования, у меня МНОГО страниц на основе слагов, и я много использую 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) ????В отдельную работу полностью вне цикла, не меньше!
Это не имеет абсолютно никакого смысла, и поскольку это не имеет никакого смысла, я понятия не имею, с чего начать при попытке внедрить исправление.Так чего я здесь не вижу?перемотка сообщений, восстановление данных сообщений ... ничего не помогает.Я совершенно ошеломлен.
Правильно ли я использую петлю?Все, что я хочу сделать, это:
- Загрузить страницу, которая выполняет пользовательский WP_query и отображает содержимое
- Загрузить часть шаблона, которая выполняет цикл (т. Е. Один продукт)
- Отобразите часть шаблона , которая загружает страницу (т.е. content-single-product) и должна иметь значение right content
Это не должноне так ли сложно, правда?