没有其他方法可以使用:如何使用The Loop?

时间:2018-11-18 21:21:40

标签: wordpress loops post woocommerce

很抱歉,这篇文章过长。我提出这个主题所提示的愚蠢问题的原因是因为存在太多不同的问题,所以我需要提供为什么要问这个问题的详细信息。

忍受...

我正忙于创建自定义主题供个人使用,其中有很多基于子弹的页面,并且我使用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(),我喜欢它给了我一个数组而不是一个包含数组的对象的事实,因此我切换到在navigation.php标头模板部分使用get_posts()并现在我的标题部分仍然可以正常工作,并且我的产品可以完美显示...但是所有帖子和页面现在都显示相同的内容。现在,所有帖子和页面都显示相同的WooCommerce产品。 (!?)更令人困惑的是,我在navigation.php中进行了3个WP_Query调用,并且帖子和页面中的Loop都显示了FIRST查询的第一个条目,而不是最后一个...

经过艰苦的努力,我认为这样做不值得加倍使用,因此我换回使用WP_Query。现在所有事情都以我什至无法理解的方式弄乱了……现在我的帖子和页面运行正常(我的自定义菜单也是如此),但是我的产品现在在循环中都显示相同的产品。我尝试这样做:

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

以某种方式,该代码将$ post(只是指向数组的指针)变成数组本身(或其他东西),因为产品模板现在首先在我访问的每个页面上显示相同的产品,然后显示$将产品发布到应该直接位于其下方的位置。如果我在设置$ current之后立即将$ post设置为null,那么之后将$ post设置回$ current只会导致显示错误的页面。

我设法设法停止显示错误的产品,现在,只有基于子弹的页面可以工作,因为任何使用Loop的东西(帖子,页面和产品)都告诉我:

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对象作为数组传递的错误
  • 为什么我的产品可以正确显示,但我的帖子和页面无法显示
  • 或者为什么我的帖子和页面正确显示,而我的产品显示两种不同的产品

仅通过从$ posts = get_posts($ args)到$ query = new WP_Query($ args),我的功能齐全的网站如何才能解决此问题?在完全独立于Loop的单独工作中,同样如此!

这绝对没有意义,而且由于没有意义,因此我不知道尝试实施修订程序时从何处开始。那我在这里没看到什么?快退帖子,恢复帖子数据...无济于事。我完全傻眼了。

我不正确使用循环吗?我要做的就是这样:

  1. 加载执行自定义WP_query并显示内容的页面
  2. 加载执行循环的模板部分(即单一产品)
  3. 显示页面加载的模板部分 (即content-single-product),并将其作为 right 内容

应该不难吗?

1 个答案:

答案 0 :(得分:0)

这样一件简单的小事就能引起如此多的悲痛... :( 在导航模板部分的内部,当我从get_posts()切换回WP_Query时,我在$ posts中存储了一个查询,在$ query中存储了另一个查询。似乎$ posts是WordPress中的保留变量,因为当我将$ posts更改为$ query的那一刻,一切都再次完美地工作了100%!

我知道$ post而不是$ posts。现在我知道了。特别感谢@zipkundan向我指出wp_reset_postdata()。该页面告诉我,自定义查询确实会影响全局Loop(对我来说是新闻!),并展示了如何解决它。

所以基本上,我的帖子无法显示其预期问题是由于我在运行自定义循环后没有调用wp_reset_postdata()以及所有无法解释的怪异页面异常的原因是我保存了自定义查询保留的变量名。

神秘感解决了。