这个问题是关于一个非常具体的情况。
该网站有一个模板文件,可以运行带有缩略图、链接标题和摘录的默认类别查询,也可以仅根据查看者的选择运行链接标题。也就是说,一旦进入类别默认页面,查看器就可以单击仅列表选项。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 ));
最合适的回答,由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注入攻击