如何通过自定义字段对WordPress自定义帖子类型的管理区域进行排序

wordpress.stackexchange https://wordpress.stackexchange.com/questions/45

  •  16-10-2019
  •  | 
  •  

在编辑我的自定义帖子类型之一时,我希望能够通过自定义字段列出所有条目,而不是它们发布的日期(对于自定义帖子类型而言,可能无关紧要)。我从有关自定义帖子类型的博客文章的评论中获得了潜在客户,作者说这是可能的,他甚至做到了,因此您可以单击“自定义排序”的列名。他提到了 posts_orderby 我在自己的评论中指出的功能,但现在我可以再找到博客文章了。有什么建议么?我看到了一种使用的解决方案

add_action('wp', 'check_page');

check_page 使用的功能 add_filter 要更改查询,但我很确定它只能在主题文件中而不是在管理区域中。

有帮助吗?

解决方案

您可能可以通过缺乏答案来想象,解决方案并非完全微不足道。我所做的是创建一个有点独立的示例,该示例假定自定义的帖子类型”movie“和自定义字段键”类型".

免责声明: :这与WP3.0一起使用,但我不能确定它将与早期版本一起使用。

基本上,您需要钩上两个(2)个钩子才能使其正常工作,而另外两(2)个钩子才能使其变得明显且有用。

第一个钩是'restrict_manage_posts'这使您可以发出HTML <select> 在帖子列表上方的区域中批量行动“ 和 ”显示日期“过滤器。提供的代码将生成”排序方式:“在此屏幕片段中看到的功能:

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
(资源: mikeschinkel.com)

该代码使用直接SQL,因为没有WordPress API函数来为邮政类型提供所有元keys的列表(听起来像未来 trac 票给我...)无论如何,这是代码。请注意,它从中获取帖子类型 $_GET 并验证以确保它既是有效的帖子类型 post_type_exists() 以及成为 movie 帖子类型(这两项检查是过分的 sortby URL参数与WordPress中的其他任何内容没有冲突:

add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
    if (isset($_GET['post_type'])) {
        $post_type = $_GET['post_type'];
        if (post_type_exists($post_type) && $post_type=='movie') {
            global $wpdb;
            $sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
            $results = $wpdb->get_results($sql);
            $html = array();
            $html[] = "<select id=\"sortby\" name=\"sortby\">";
            $html[] = "<option value=\"None\">No Sort</option>";
            $this_sort = $_GET['sortby'];
            foreach($results as $meta_key) {
                $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                $value = esc_attr($meta_key->meta_key);
                $html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
            }
            $html[] = "</select>";
            echo "Sort by: " . implode("\n",$html);
        }
    }
}

第二个必需的步骤是使用 parse_query WordPress在WordPress决定的一个挂钩决定应运行的挂钩,但在运行查询之前。在这里,我们可以设置 orderbymeta_key 在查询中 query_var 数组是 在法典中记录 在里面 orderby 参数 query_posts(). 。我们测试以确保:

  1. 我们在管理员中(is_admin()),
  2. 我们在页面上列出了管理员中的帖子($pagenow=='edit.php'),
  3. 该页面已被调用 post_type URL参数等于 movie, , 和
  4. 该页面也已被调用 sortby URL参数,并且没有通过'的值没有任何'

如果所有这些测试通过,我们然后设置 query_vars (如有记录 这里) 至 meta_value 还有我们的 sortby 价值类型':

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
        isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
        isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}

这就是您需要做的;不 ”posts_order“ 或者 ”wp“需要钩子!当然您实际上需要做更多的事情;您需要在页面上添加一些列表帖子的列,以便您实际上可以看到它正在按照它进行排序的值,否则用户会感到非常困惑。因此,请添加一个 manage_{$post_type}_posts_columns 钩子,在这种情况下 manage_movie_posts_columns. 。此钩通过列的默认数组,为简单起见,我只是用两个标准列代替了它。复选框(cb)和帖子名称(title)。 (您可以检查 posts_columnsprint_r() 默认情况下查看其他可用的东西。)

我决定添加一个”排序:“有一个 sortby URL参数,何时不是 None:

add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
    $posts_columns = array(
        'cb' => $posts_columns['cb'],
        'title' => 'Movie Name',
        );
    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
        $posts_columns['meta_value'] = 'Sorted By';

    return $posts_columns;
}

最后我们使用 manage_pages_custom_column 当有适当帖子类型的帖子以及可能的冗余测试时,挂钩可以实际显示该值 is_admin()$pagenow=='edit.php'. 。当有一个 sortby URL参数我们提取由显示在我们列表中的显示的自定义字段值。这就是它的外观(请记住,这是测试数据,因此在电影分类中没有来自花生画廊的评论!:)::::):

Custom Columns added for a Custom Post Type in the WordPress Admin
(资源: mikeschinkel.com)

这是代码:

add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
    global $pagenow;
    $post = get_post($post_id);
    if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php')  {
        switch ($column_name) {
            case 'meta_value':
                if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
                    echo get_post_meta($post_id,$_GET['sortby'],true);
                }
                break;
        }
    }
}

请注意,这只会拾取第一个”类型“ 为一个 movie, ,即在给定密钥的多个值的情况下,第一个meta_value。但是话又说回来,我不确定它会如何工作!

对于那些不熟悉此代码的人,您可以将其放入插件中,或者更有可能将新手放在插件中 functions.php 在您当前的主题中文件。

这如何有所帮助。

其他提示

从WordPress 3.1(我正在使用beta)列表,现在可以通过其标题进行排序。

以下文章详细介绍了如何实施它们。

http://scripu.net/wordpress/custom-sortable-columns.html

这是一个简单的解决方案:

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

只是更换 您的帖子类型'your_custom_field'

许可以下: CC-BY-SA归因
scroll top