在Wordpress上过滤带有自定义分类法的帖子管理
问题描述:
我有一个Wordpress网站,有几种产品。它们被添加为帖子(只是将标签更改为产品),并且它们有两个自定义分类法。我添加了一个下拉菜单,为每个下面的代码管理后屏幕上这些自定义分类法:在Wordpress上过滤带有自定义分类法的帖子管理
add_action('restrict_manage_posts', 'product_type_filter');
function product_type_filter() {
global $typenow;
$post_type = 'post';
$taxonomies = array('linha','aplicacoes');
if ($typenow == $post_type) {
foreach ($taxonomies as $taxonomy) {
$selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
$info_taxonomy = get_taxonomy($taxonomy);
wp_dropdown_categories(
array(
'show_option_all' => __("Todas as {$info_taxonomy->label}"),
'taxonomy' => $taxonomy,
'name' => $taxonomy,
'orderby' => 'name',
'selected' => $selected,
'value_field' => 'slug',
'show_count' => false,
'hide_empty' => true,
)
);
}
};
}
这是创建和正确显示2个下拉菜单(见截图附后)。问题是,当您选择该下拉列表的选项并点击过滤器来过滤产品时,结果往往是错误的。我说通常是,因为对于某些特定的分类法,过滤器起作用,这真的让我感到困扰。是的,下拉菜单中显示的每个选项都分配了产品。
wordpress admin post page screenshot
我设法注意到,过滤后的网址提交这个样子的(当它的工作原理)来理解这个问题:
http://www.mysitedomain.com.br/wp-admin/edit.php?post_status=all&post_type=post&m=0&cat=0&lang=pt-br&linha=embare-cle-redonda&filter_action=Filtrar&paged=1
而且像这样(当它返回时没有职位,尽管事实上有帖子显示符合标准):
http://www.mysitedomain.com.br/wp-admin/edit.php?s&post_status=all&post_type=post&action=-1&m=0&cat=0&lang=pt-br&linha=puruba&filter_action=Filtrar&paged=1&action2=-1
注意这个搜索参数添加到第二个url的开始? /wp-admin/edit.php? 小号& post_status =所有& post_type =交&行动= -1 & m = 0的&猫= 0 & LANG = PT-BR & linha = puruba & filter_action = Filtrar &寻呼= 1 &动作2 = -1
如果我删除该参数,则加载正确的帖子。任何人都有如何解决这个问题的线索?我想这是一个WordPress的核心问题,但我不知道为什么它只发生在每个分类的某些条款。
顺便说一句我跑的WordPress 4.8
答
你可以尝试添加一个后此功能,您有吗?
function filterPosts($query) {
global $pagenow;
$qv =& $query->query_vars;
if (
$pagenow == 'edit.php' &&
isset($qv['tax-slux']) &&
ctype_digit($qv['tax-slug']) // stricter than is_numeric()
) {
if ($term = get_term_by('id', $qv['tax-slug'], 'tax-slug')) {
$qv['tax-slug'] = $term->slug;
}
}
}
add_filter('parse_query', 'filterPosts');
编辑:
下面是完整的功能,对我和我的自定义后类型
function filterSomePosts() {
global $typenow;
$post_type = 'post_type';
$taxonomy = 'some-taxonomy';
if ($typenow == $post_type) {
$selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
$info_taxonomy = get_taxonomy($taxonomy);
wp_dropdown_categories(array(
'show_option_all' => __("Filter by some posts"),
'taxonomy' => $taxonomy,
'name' => $taxonomy,
'orderby' => 'name',
'selected' => $wp_query->query[$taxonomy],
'show_count' => true,
'hide_empty' => true,
));
};
}
add_action('restrict_manage_posts', 'filterSomePosts');
function showFilteredResults($query) {
global $pagenow;
$qv =& $query->query_vars;
if (
$pagenow == 'edit.php' &&
isset($qv['some-taxonomy']) &&
ctype_digit($qv['some-taxonomy']) // stricter than is_numeric()
) {
if ($term = get_term_by('id', $qv['some-taxonomy'], 'some-taxonomy')) {
$qv['some-taxonomy'] = $term->slug;
}
}
}
add_filter('parse_query', 'showFilteredResults');
你可以给这个功能的去工作,更新您的文章类型,分类蛞蝓。
不幸的是,没有做到绝招。 但是,我注意到,当搜索框可用时,它总是会发生(只有在显示帖子时它才会显示)。 因此,当您第一次过滤到“找不到任何帖子”,并且该页面没有搜索字段时,因此当我再次过滤该页面时,查询将起作用并显示结果。 所以我猜这个问题与被添加到查询中的搜索参数有关。有没有办法改变过滤器,以确保搜索参数不添加,如果该字段为空? –
刚刚更新了我的答案 - 这是完整的功能,适用于我自定义帖子类型 - 显然我将其改名为帖子类型和分类到一些随机名:) –
原来我们的两个代码都是正确的。在测试你的函数并得到相同的结果后,我去了我的插件并禁用了所有可能与搜索查询搞砸的东西。 [搜索一切](https://wordpress.org/plugins/search-everything/)插件是一个罪魁祸首。对不起,我花了很长时间才意识到这一点,并且非常感谢您的帮助! –