基本上,我正在努力this tutorial 将操作添加到pre_get_posts
并创建一个自定义meta\\u查询,以便我可以在URL中更改查询,并显示婴儿、儿童和家庭书籍,如下所示:
http://website.com/books/?type=babies,children,home
我正在使用
Advanced Custom Fields plugin 对于我的自定义字段,我的自定义字段称为“type”,并在WordPress中设置为复选框字段,因此它接受多个值。
就我个人而言,我不知道如何让它显示被查询的帖子。
function my_pre_get_posts( $query ) {
if( is_admin() ) { return; }
$meta_query = $query->get(\'meta_query\');
if( !empty($_GET[\'type\']) ) {
$type = explode(\'|\', $_GET[\'type\']);
$meta_query[] = array(
\'key\' => \'type\',
\'value\' => $type,
\'compare\' => \'IN\',
);
}
$query->set(\'meta_query\', $meta_query); // update the meta query args
return; // always return
}
使用
\'compare\' => \'LIKE\'
只返回随机帖子,使用
IN
返回空白结果页。
不确定是否与我的$_GET[\'type\']
参数,该参数应为字符串。
感谢您对解决此问题的任何帮助。我正在喝第五杯咖啡,今晚看起来不太好。
archive.book.php
$args = array(
\'post_type\' => \'book\',
\'posts_per_page\' => 10,
);
$wp_query = new WP_Query( $args );
while( $wp_query->have_posts() ) {
$wp_query->the_post();
get_template_part( \'content\', get_post_format() );
}
此正常循环:
<?php
print_r( $wp_query->request );
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
get_template_part( \'content\', get_post_format() );
} // end while
} // end if
?>
输出:
SELECT SQL_CALC_FOUND_ROWS blISt3rs871o_posts.ID FROM blISt3rs871o_posts WHERE 1=1 AND blISt3rs871o_posts.post_type = \'book\' AND (blISt3rs871o_posts.post_status = \'publish\' OR blISt3rs871o_posts.post_status = \'private\') ORDER BY blISt3rs871o_posts.post_date DESC LIMIT 0, 10
SO网友:Brian Richards
首先,请记住pre_get_posts
是在WP运行的每个查询上运行的钩子,因此在使用它时要非常非常小心。这就是说,它绝对是您想要做的事情的最佳工具,当然比在页面模板中编写单独的自定义查询要好。
我在该函数的开头添加了一些附加条件,以确保在以下情况下尽早放弃该函数:不针对主循环、在管理页面上运行或不存在“type”查询字符串。您应该在此处添加更多条件以进一步限制它,例如:。if ( ! is_page( \'something\' ) ) { return; }
或if ( ! is_front_page() ) { return; }
.
也就是说,下面是一些示例代码:
/**
* Add custom meta filter to main query on any page.
*
* @since 1.0.0
*
* @param object $query WP Query object.
*/
function wpse129223_custom_meta_query( $query ) {
// If not on the main query, or on an admin page, bail here
if ( ! $query->is_main_query() || is_admin() ) {
return;
}
// If \'type\' isn\'t being passed as a query string, bail here
if ( empty( $_GET[\'type\'] ) ) {
return;
}
// Get the existing meta query, cast as array
$meta_query = (array) $query->get(\'meta_query\');
// Convert \'type\' into an array of types
$types = explode( \',\', $_GET[\'type\'] );
// Ensure that types aren\'t empty
if ( is_array( $types ) && ! empty( $types ) ) {
// Build a meta query for this type
$meta_query[] = array(
\'key\' => \'type\',
\'value\' => $types,
\'compare\' => \'IN\',
);
// Update the meta query
$query->set( \'meta_query\', $meta_query );
}
}
add_action( \'pre_get_posts\', \'wpse129223_custom_meta_query\' );
这要求查询字符串以逗号分隔,正如您在示例website中所示。com/随便什么/?类型=一、二、三。在您的代码示例中,您正在寻找一个管道字符,这就是@Foxsk8在其注释中的意思。