WordPress中的链接是否可以包含作为$_POST拾取的查询字符串

时间:2020-05-30 作者:Nora McDougall-Collins

这个问题是关于一个非常具体的情况。

该网站有一个模板文件,可以运行带有缩略图、链接标题和摘录的默认类别查询,也可以仅根据查看者的选择运行链接标题。也就是说,一旦进入类别默认页面,查看器就可以单击仅列表选项。https://domain/category/glossary of wood terms?format=列出此部件工作正常。

第二个选项(仅链接标题)应选取整个数据集,而不是分页的数据集。

使用pre\\u get\\u posts,我可以设置查询以获取整个数据集(未分页)

$query->set( \'posts_per_page\', -1 );
以及只在特定URL上运行该代码的if测试。这就是问题所在。

WordPress发现地址是https://domain/category/glossary-of-wood-terms?category_name=glossary-of-wood-terms 隐藏查询字符串。但WordPress将其视为$\\u POST变量,而不是$\\u GET变量。

我应该在pre\\u get\\u posts测试中使用什么地址?

这是我最初添加到函数中的代码。php

function get_all_terms($query) 
{
    // This will run for all main queries that are not in wp-admin.
    // You may want "is_archive()", "is_page(\'slug\')" or some other condition.

    if(empty($Format))
      $Format = \'test 1\';

    echo $Format;

    if ( ! is_admin() && $query->is_main_query() && ($Format == \'list\'))
    {
        $query->set( \'posts_per_page\', -1 );
    }
}
  add_action( \'pre_get_posts\', \'get_all_terms\' ); 
下面是我添加的代码,以查看WordPress显示为URL的内容。此代码位于标题中。php。正文中的$current\\u url上有回音

  global $wp; 
  if(!empty($_POST[\'format\']))
    $Format = $_POST[\'format\'];
  $current_url = add_query_arg( $wp->query_vars, home_url( $wp->request ));

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

查看pre_get_posts 钩子,问题变得明显$Format 变量正在从稀薄的空气中拉出:

function get_all_terms($query) 
{
    if(empty($Format))
      $Format = \'test 1\';

    echo $Format;
此变量未定义,您不能在一个文件中声明一个变量,然后在其他类似的地方使用它。要做到这一点,必须将其声明为全局变量,并且必须在每个要使用它的地方声明它。

我的建议:don\'t, 不需要此变量,请采用不同的方法。

此外,对URL存在误解。WordPress在到达pre_get_posts 步骤,有时没有URL!E、 g.在WP CLI命令中。

查询变量只是WP_Query 需要。重写规则将漂亮的URL转换为查询变量列表,您可以在URL中放置一个查询变量来覆盖大部分时间。但是,查询变量并不意味着表示WP认为URL是什么。他们甚至可能不同意URL!

相反,如果要根据URL更改行为,只需检查URL:

function nora_get_all_terms( \\WP_Query $query ) {
    if ( !isset( $_GET[\'format\' ] ) ) {
        return;
    }
这里我们检查format URL参数,如果未设置,我们将提前返回。如果已设置,请继续此功能并使用$_GET[\'format\'].

一些注意事项:

  • get_all_terms 是一个very 通用名称,至少在其前面加前缀或使用更具体的名称,全局变量不好,请避免使用它们echo 使用诸如query monitor之类的工具查看查询变量,或者更好的方法是使用xdebug+和IDE(如PHPStorm)通过调试器直接查看变量,将变量名称保持为小写,并遵循WP编码标准,一个像样的代码编辑器将自动为您缩进,代码缩进被破坏,这可能会导致容易发生的错误,如果缩进正确,这些错误是不可能发生的。至少,在向其他人显示代码之前先修复缩进,因为缩进的中断会使代码难以阅读和理解$_POST$_GET 由PHP而不是WordPress填充。$_POST 除非您的浏览器POST 请求始终从您试图解决的问题开始,不要落入XY问题的陷阱考虑查看重写规则,您可以添加自定义查询变量,并通过将URL参数嵌入URL本身来删除URL参数format/list 最后,请列出白名单并验证格式值,否则人们可能会将恶意值放入其中,如果格式值打印在页面的任何位置,您将受到URL注入攻击

相关推荐

Multiple Parent Category URLs

我继承了一个混乱的Wordpress网站,我希望有人能提供一个不使用自定义帖子类型的解决方案&;自定义分类法。关于我的问题,我设置了以下类别:topic1 topic2 topic3 news guides 它们都不是子/子类别。现在,我的帖子设置了主题类别和新闻/指南类别e.g. topic1 + news topic2 + news topic1 + guides 我需要一个页面,显示与类别“topic1”和“新闻”的所