按自定义帖子字段值筛选管理员栏

时间:2019-03-14 作者:Mark

我有一个自定义的帖子类型,叫做dogs。在Add Dog界面中,我有一个单选按钮组,可以选择颜色,这些颜色作为元数据添加到新的Dog帖子中。大约有五种颜色可供选择。

我还设置了颜色字段,当我查看我所有的狗狗帖子时,它会显示为管理区域中可排序的列。分拣工作正常。

现在我想做的是让每个颜色值link 我可以点击它,当我点击它时,它会根据颜色值过滤所有的狗帖子。所以如果我点击“棕色”,我会看到一个只有棕色狗的列表。

在页面上,我们可以单击作者的姓名,查看由该作者筛选的页面。这是我想要的颜色和CPT狗。

我更喜欢在函数中这样做。php,而不是使用企业插件。有没有办法做到这一点?

3 个回复
SO网友:Qaisar Feroz

根据@Andy Macaulay Brook对您的问题的评论,您可以尝试以下操作(它将在管理员列表顶部的过滤器按钮旁边添加一个下拉列表):

add_action( \'restrict_manage_posts\',  \'filter_dogs_by_color\' );

// Filter Dogs by Color
function filter_dogs_by_color( $post_type ) {
        if ( \'dog\' !== $post_type ) return;    // Replace \'dog\' with your post_type

        $taxonomy = \'color\'; // Replace \'color\' with your taxonomy slug

        $info_taxonomy = get_taxonomy($taxonomy);
        $selected      = isset($_GET[$info_taxonomy->query_var]) ? $_GET[$info_taxonomy->query_var] : \'\';

        wp_dropdown_categories(array(
             \'show_option_all\' => __("Show All {$info_taxonomy->label}"),
             \'taxonomy\'        => $taxonomy,
             \'name\'            => $info_taxonomy->query_var,
             \'orderby\'         => \'name\',
             \'selected\'        => $selected,
             \'hide_empty\'      => true,
              \'value_field\'   => \'slug\'
         )
        );
}

SO网友:Andy Macaulay-Brook

为了进行比较,我在dog 具有两个自定义字段dog_colour 和分类法dog_colour.

将这两个列添加为admin列后,我们可以得到:

enter image description here

分类术语会自动与查询变量链接,因此单击其中一个会转到URL,如http://example.com/wp-admin/edit.php?post_type=dog&dog_colour=red 只显示那些带有红色的狗。

对于你的数据,分类法似乎是正确的选择:所有的狗都有一种颜色,而颜色是你可能想要列出狗的依据。

但是,在其他一些用例中,自定义字段是合适的,并且您可能希望在“管理”列中单击该字段,以显示所有具有该字段值的帖子,所以下面。。。

与分类法不同,自定义字段不会自动获取查询变量,因此我们添加了这样一个变量:

function wpse331647_custom_query_vars_filter( $vars ) {
    $vars[] .= \'dogcolour\';
    $vars[] .= \'dogbreed\';
    return $vars;
}

add_filter( \'query_vars\', \'wpse331647_custom_query_vars_filter\' );
现在,使用调用URL?dogcolour=red 将设置一个名为dogcolour 具有值red 在WP查询中。

然后,我们需要修改WP查询,以在存在该变量时考虑该变量,但仅在admin中,并且仅在查询用于狗时考虑该变量:

add_action( \'pre_get_posts\', \'wpse331647_alter_query\' );

function wpse331647_alter_query( $query ) {

    if ( !is_admin() || \'dog\' != $query->query[\'post_type\'] )
        return;

    if ( $query->query_vars[\'dogcolour\'] ) {
        $query->set( \'meta_key\', \'dog_colour\' );
        $query->set( \'meta_value\', $query->query_vars[\'dogcolour\'] );
    }

    if ( $query->query_vars[\'dogbreed\'] ) {
        $query->set( \'meta_key\', \'dog_breed\' );
        $query->set( \'meta_value\', $query->query_vars[\'dogbreed\'] );
    }

}
现在,如果我们去http://example.com/wp-admin/edit.php?post_type=dog&dogcolour=red 我们得到:

enter image description here

最后一步是修改当前将字段添加到管理列的方式,以便字段值与查询字符串中的正确值链接。

您当前拥有:

echo \'<a href=http://localhost/wordpress/wp-admin/edit.php? dogcolour=\' . $x . \'>\' . $x . \'</a>\';
请尝试以下操作:

echo \'<a href="\';
echo admin_url( \'edit.php?post_type=dog&dogcolour=\' . urlencode( $x ) );
echo \'">\';
echo $x;
echo \'</a>\';
[仅打断成单独的行以帮助易读]

PHP的urlencode() 为您处理元值中的空格,甚至URL。WP的admin_url() 将为您处理正确的域、协议/方案和管理员路径。

当然,您可以通过使用post类型查询变量而不是硬编码来使代码更加通用。

SO网友:Jurgen Oldenburg

看看Admin Columns Pro插件,它可以让您完全控制所有列和字段。即使来自自定义字段的图像也能完美工作。

https://www.admincolumns.com/

他们还有一个免费版本:

https://wordpress.org/plugins/codepress-admin-columns/

相关推荐

允许直接访问WordPress中的文件/文件夹以取代wp-admin

以下是场景:我想为我的客户设计一个全新的wordpress管理员(使用wordpressautoload 作为与WordPress交互的核心)。我尝试过稍微修改css,甚至使用javascript来操作DOM,但似乎效率很低,因为我可以重新编写一个新页面,而不是操作现有页面。考虑到这一点,我创建了一个新文件夹,custom_dashboard, 并尝试在客户访问时重定向他们/wp-admin. 然而,它总是显示404 NOT FOUND 当我打开时mydomain.com/custom_dashboard