WordPress admin 按 meta 过滤,过滤选项在搜索后消失
Wordpress admin filter by meta, filter options disappear after search
我编写这些函数是为了根据元数据过滤帖子。上下文是一个房地产网站,属性是 CPT。在这些功能中,我通过销售代理人在管理员端过滤属性。该功能适用于任何新尝试。如果选择了代理,过滤器将仅显示该代理出售的房产。
我遇到的问题在初始过滤后仍然存在。代理列表就这样消失了。我感觉我 运行 创建列表的循环由于某种原因被暂停了。
为了直观地说明,这是搜索前过滤器列表的图片。
下面是使用过滤器后的样子
显然,如果 ADMIN_FILTER_FIELD_VALUE=(此处为 id 编号)以任何设置值出现在 url 中,则循环将不会 运行。
这是所有这些的代码。
add_filter( 'parse_query', 'agents_posts_filter' );
function agents_posts_filter( $query ){
global $pagenow;
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ( 'properties' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') {
$query->query_vars['meta_key'] = 'select-agent-value';
$query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}
}
add_action('restrict_manage_posts', 'filter_post_type_by_agent');
function filter_post_type_by_agent(){
global $pagenow;
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ('properties' == $type && is_admin() && $pagenow=='edit.php') {
?>
<select name="ADMIN_FILTER_FIELD_VALUE">
<option value=""><?php _e('Filter By Agent'); ?></option>
<?php
$args = array(
'post_type' => 'agents',
'posts_per_page' => -1
);
$posts = new WP_Query($args);
if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post(); ?>
<option value="<?php the_ID(); ?>"> <?php the_title(); ?> </option>
<?php
endwhile;
endif;
?>
</select>
<?php
}
}
我在这里明显遗漏了什么吗?感谢任何人可以提供的任何帮助。
我认为 query_vars(元键和元值)也添加到下面的查询 WP_Query post 类型代理中。 (转储 $posts 以检查 meta_query)
尝试用 get_posts 替换 WP_Query。
也许有帮助! ^^
编辑:
上面的查询也加入到下面的查询中。所以我尝试在下面修复它。
add_action( 'pre_get_posts', 'agents_posts_filter' );
function agents_posts_filter( $query ){
global $pagenow;
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ( 'post' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['abc']) && $_GET['abc'] != '' && $query->is_main_query()) {
$query->set('meta_key', 'select-agent-value');
$query->set('meta_value', $_GET['abc']);
}
}
我编写这些函数是为了根据元数据过滤帖子。上下文是一个房地产网站,属性是 CPT。在这些功能中,我通过销售代理人在管理员端过滤属性。该功能适用于任何新尝试。如果选择了代理,过滤器将仅显示该代理出售的房产。
我遇到的问题在初始过滤后仍然存在。代理列表就这样消失了。我感觉我 运行 创建列表的循环由于某种原因被暂停了。
为了直观地说明,这是搜索前过滤器列表的图片。
下面是使用过滤器后的样子
显然,如果 ADMIN_FILTER_FIELD_VALUE=(此处为 id 编号)以任何设置值出现在 url 中,则循环将不会 运行。
这是所有这些的代码。
add_filter( 'parse_query', 'agents_posts_filter' );
function agents_posts_filter( $query ){
global $pagenow;
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ( 'properties' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') {
$query->query_vars['meta_key'] = 'select-agent-value';
$query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}
}
add_action('restrict_manage_posts', 'filter_post_type_by_agent');
function filter_post_type_by_agent(){
global $pagenow;
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ('properties' == $type && is_admin() && $pagenow=='edit.php') {
?>
<select name="ADMIN_FILTER_FIELD_VALUE">
<option value=""><?php _e('Filter By Agent'); ?></option>
<?php
$args = array(
'post_type' => 'agents',
'posts_per_page' => -1
);
$posts = new WP_Query($args);
if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post(); ?>
<option value="<?php the_ID(); ?>"> <?php the_title(); ?> </option>
<?php
endwhile;
endif;
?>
</select>
<?php
}
}
我在这里明显遗漏了什么吗?感谢任何人可以提供的任何帮助。
我认为 query_vars(元键和元值)也添加到下面的查询 WP_Query post 类型代理中。 (转储 $posts 以检查 meta_query) 尝试用 get_posts 替换 WP_Query。 也许有帮助! ^^
编辑:
上面的查询也加入到下面的查询中。所以我尝试在下面修复它。
add_action( 'pre_get_posts', 'agents_posts_filter' );
function agents_posts_filter( $query ){
global $pagenow;
$type = 'post';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ( 'post' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['abc']) && $_GET['abc'] != '' && $query->is_main_query()) {
$query->set('meta_key', 'select-agent-value');
$query->set('meta_value', $_GET['abc']);
}
}