posts_orderby
函数,但是现在我可以找到该博客文章了。有什么建议?我看到一个使用add_action('wp', 'check_page');
的解决方案,而
check_page
函数使用add_filter
来更改查询,但是我敢肯定,它只能在主题文件中使用,而不能在管理区域。#1 楼
正如您可能会想到的那样,由于缺少提供的答案,因此解决方案并非完全无关紧要。我要做的是创建一个自成一体的示例,该示例假定自定义帖子类型为“movie
”,而自定义字段键为“ Genre”。免责声明:这适用于WP3.0,但我不能确定它是否可以在早期版本中使用。
您基本上需要钩两(2)个钩才能使其正常工作,而另外两个(2)钩则使其明显且有用。
第一个钩子是“
restrict_manage_posts
”,它使您可以在帖子列表上方的区域中发出HTML <select>
,其中可以过滤“批量操作”和“显示日期”。所提供的代码将生成“排序依据:”功能,如以下屏幕片段所示:(来源:mikeschinkel.com)
该代码使用直接SQL,因为不是WordPress API函数,无法提供帖子类型的所有meta_keys列表(听起来像是将来给我的火车票……)无论如何,这是代码。请注意,它从
$_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决定一个查询应运行但在运行查询之前被调用。在这里,我们可以在查询的orderby
数组中设置meta_key
和query_var
的值,这些值记录在食典中orderby
参数的query_posts()
中。我们进行测试以确保:我们在管理员(
is_admin()
)中,我们在列出管理员(
$pagenow=='edit.php'
)中的帖子的页面上,已使用
post_type
URL参数movie
和调用了该页面该页面还使用
sortby
URL参数进行了调用,并且该页面未传递'None'值。如果所有这些测试都通过,则将
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_columns
的print_r()
,以查看默认情况下还有哪些可用。)我决定为存在
sortby
URL参数和不存在None
URL参数添加一个“排序依据:” :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参数时,我们提取自定义字段值,该值由显示在列表中的排序。外观如下(请记住,这是测试数据,所以花生画廊对电影分类没有评论!:):(来源: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
文件中您当前的主题。如何帮助您。
评论
+1,只是为了努力。但是,如果手绘圆圈,那就更好了:-)
– Jan Fabry
10年8月12日在7:34
知道如何完全删除“显示所有日期”过滤器,以便仅显示给定帖子类型的自定义过滤器吗?
–RailsTweeter
2014年5月22日在17:02
@RailsTweeter使用我在这里展示的技术,其中包含HTML生成的两个钩子是“ months_dropdown_results”和“ restrict_manage_posts”。附言赞誉始终受到赞赏。 :)
– MikeSchinkel
2014年5月22日23:56
@MikeSchinkel,现在有了WP API,这会在某种程度上更新您的代码吗?
– samjco
19年2月16日在20:23
@samjco不确定。不幸的是,我目前没有时间修改此内容。
– MikeSchinkel
19年2月17日在2:53
#2 楼
从WordPress 3.1开始(我正在使用Beta版),现在可以通过标题对列进行排序了。以下帖子详细介绍了如何实现它们。
http:// scribu .net / wordpress / custom-sortable-columns.html
#3 楼
这是一个简单的解决方案:/* --------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" );
只需替换您的POST TYPE和'your_custom_field'
评论
这是另一个有用的答案,可以按....wordpress.stackexchange.com/questions/66455/…
对帖子进行排序