$POST在WordPress循环中未定义[AJAX]

时间:2021-05-25 作者:Nasif

我目前正在通过ajax调用下一页的帖子。我使用jQuery发出请求,在php处理程序函数中构建一个自定义查询,遍历它,然后发送回HTML。这是我的循环:

  $args = $_REQUEST[\'query\'];

  $request_query = new WP_Query($args);

  if ($request_query->have_posts()) {
      while ($request_query->have_posts()) {
          $request_query->the_post();

          if ($post->post_type == \'foo\') {
              get_template_part(\'/parts/thumbnail-templates/foo\');
          } else if ($post->post_type == \'bar\') {
              get_template_part(\'/parts/thumbnail-templates/bar\');
          } else {
              get_template_part(\'/parts/thumbnail-templates/generic\');
          }
      }
  }
一切正常,循环按预期运行,除了我得到一个错误$post 没有定义,所以我的两个ifs失败,以及我的模板中调用元数据的一些行$post->the_meta_key.

我想发生这种情况的原因是,还有一些其他的wp魔术在幕后运行$post 在模板文件中可用,但在ajax中不可用。因此,我补充道global $post; 就在我的if 语句,现在它按预期工作。

The question

可以打电话吗global $post; 在ajax的循环中,还是有更好的方法来访问当前的post对象?此外,如果对我的方法有任何通用的最佳实践建议,请让我知道。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

打电话给global$post可以吗;在ajax的循环中,还是有更好的方法来访问当前的post对象?

我会在循环之外,但在相同的范围内进行,以避免重复,但除此之外,答案是:

If it works, then it works, don\'t stress about it,

global $post; 工作,还有另一种选择$post = get_post(); 但这很少见。大多数人就是这样global $post; 出于习惯。

您还可以通过以下方式完全避免:

if ( get_post_type() === \'foo\' ) {
我认为发生这种情况的原因是,还有其他一些wp魔术在幕后运行,使$post在模板文件中可用,但在ajax中不可用。因此,我添加了global$post;就在我的if语句之前,现在它按预期工作。

不,这个理论是不正确的,post循环在AJAX处理程序中也是一样的

$args = $_REQUEST[\'query\'];
$request_query = new WP_Query($args);
这应该被视为一个主要的安全漏洞,因为现在任何人都可以查询任何内容,并且它们可以触发超级昂贵的查询,从而打击数据库,也就是资源耗尽攻击。白名单您允许的参数及其有效值!

相关推荐

如何在没有js的情况下创建AJAX端点?

我的问题很简单。我正在从事一个将WordPress用作无头CMS(类似)的项目。我创建了一个ajax端点,但它总是返回400。现在,我创建了一个子主题来测试这些功能。下面是函数。我正在使用的php。<?php function login_with_ajax() { echo "hey"; exit(); $username = $_POST[\'username\']; $password = $_POS