2017-07-16 75 views
0

我有一个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

回答

0

你可以尝试添加一个后此功能,您有吗?

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'); 

你可以给这个功能的去工作,更新您的文章类型,分类蛞蝓。

+0

不幸的是,没有做到绝招。 但是,我注意到,当搜索框可用时,它总是会发生(只有在显示帖子时它才会显示)。 因此,当您第一次过滤到“找不到任何帖子”,并且该页面没有搜索字段时,因此当我再次过滤该页面时,查询将起作用并显示结果。 所以我猜这个问题与被添加到查询中的搜索参数有关。有没有办法改变过滤器,以确保搜索参数不添加,如果该字段为空? –

+0

刚刚更新了我的答案 - 这是完整的功能,适用于我自定义帖子类型 - 显然我将其改名为帖子类型和分类到一些随机名:) –

+0

原来我们的两个代码都是正确的。在测试你的函数并得到相同的结果后,我去了我的插件并禁用了所有可能与搜索查询搞砸的东西。 [搜索一切](https://wordpress.org/plugins/search-everything/)插件是一个罪魁祸首。对不起,我花了很长时间才意识到这一点,并且非常感谢您的帮助! –

相关问题