如何通过自定义字段对WordPress自定义帖子类型的管理区域进行排序
-
16-10-2019 - |
题
在编辑我的自定义帖子类型之一时,我希望能够通过自定义字段列出所有条目,而不是它们发布的日期(对于自定义帖子类型而言,可能无关紧要)。我从有关自定义帖子类型的博客文章的评论中获得了潜在客户,作者说这是可能的,他甚至做到了,因此您可以单击“自定义排序”的列名。他提到了 posts_orderby
我在自己的评论中指出的功能,但现在我可以再找到博客文章了。有什么建议么?我看到了一种使用的解决方案
add_action('wp', 'check_page');
和 check_page
使用的功能 add_filter
要更改查询,但我很确定它只能在主题文件中而不是在管理区域中。
解决方案
您可能可以通过缺乏答案来想象,解决方案并非完全微不足道。我所做的是创建一个有点独立的示例,该示例假定自定义的帖子类型”movie
“和自定义字段键”类型".
免责声明: :这与WP3.0一起使用,但我不能确定它将与早期版本一起使用。
基本上,您需要钩上两个(2)个钩子才能使其正常工作,而另外两(2)个钩子才能使其变得明显且有用。
第一个钩是'restrict_manage_posts
'这使您可以发出HTML <select>
在帖子列表上方的区域中批量行动“ 和 ”显示日期“过滤器。提供的代码将生成”排序方式:“在此屏幕片段中看到的功能:
(资源: 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决定的一个挂钩决定应运行的挂钩,但在运行查询之前。在这里,我们可以设置 orderby
和 meta_key
在查询中 query_var
数组是 在法典中记录 在里面 orderby
参数 query_posts()
. 。我们测试以确保:
- 我们在管理员中(
is_admin()
), - 我们在页面上列出了管理员中的帖子(
$pagenow=='edit.php'
), - 该页面已被调用
post_type
URL参数等于movie
, , 和 - 该页面也已被调用
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_columns
与 print_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参数我们提取由显示在我们列表中的显示的自定义字段值。这就是它的外观(请记住,这是测试数据,因此在电影分类中没有来自花生画廊的评论!:)::::):
(资源: 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)列表,现在可以通过其标题进行排序。
以下文章详细介绍了如何实施它们。
这是一个简单的解决方案:
/* --------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'