在 Claudio Simeone 最近发表的一篇文章中,他演示了如何向帖子添加额外的列,或自定义帖子类型、管理屏幕(或删除现有的)。在这个快速技巧中,我将在此基础上向您展示如何使新创建的列可排序。
要告诉 WordPress 您要将哪些列注册为可排序,您需要此过滤器:
'
manage_{$screen->id}_sortable_column
对于帖子和页面,$screen->id
分别是“edit-post”和“edit-page”。一般来说,对于名称为“my-post-type”的帖子类型,它是“edit-my-post-type”。
过滤器传递一个数组,其中可排序列的名称作为键,排序依据作为值。更准确地说,这些值指示在填充表的查询中设置“orderby
”参数。与删除列的方式相同,您也可以通过从该数组中删除列来使列“不可排序”。让我们看一个例子:
注册列
根据 Claudio 的文章,假设我们已将“切片”列添加到“蛋糕”帖子类型中,我们可以执行以下操作:
'
add_filter(\'manage_edit-cake_columns\', \'my_extra_cake_columns\');
function my_extra_cake_columns($columns) {
$columns[\'slices\'] =__(\'Slices\',\'myplugindomain\');
return $columns;
}
我们为该列添加了如下内容:
'
add_action( \'manage_cake_posts_custom_column\', \'my_cake_column_content\', 10, 2 );
function my_cake_column_content( $column_name, $post_id ) {
if ( \'slices\' != $column_name )
return;
//Get number of slices from post meta
$slices = get_post_meta($post_id, \'slices\', true);
echo intval($slices);
}
我已将切片存储为后元,但您的列可以由其他数据填充。
使列可排序
现在我们将自定义列注册为“可排序”。如上所述,我们使用 manage_{$screen->id}_sortable_column
过滤器。本例中的 $screen->id
是“edit-cake”。
add_filter( \'manage_edit-cake_sortable_columns\', \'my_sortable_cake_column\' );
function my_sortable_cake_column( $columns ) {
$columns[\'slices\'] = \'slice\';
//To make a column \'un-sortable\' remove it from the array
//unset($columns[\'date\']);
return $columns;
}
$columns
数组的键表示可排序列,其值告诉 WordPress 在查询中将 \'orderby
\' 设置为什么。如果该值是 WordPress 本身理解的 \'orderby
之一(这些值包括 \'title
\'、\'date
\'、\'modified
\'、\'comment_count
\',或者确实是下面列出的任何其他值WordPress Codex 中的 WP_Query)我们可以到此为止。此规则的例外情况(如本例所示)是 \'meta_value
\' 和 \'meta_value_num
\' 参数,它们也要求我们设置元密钥。
如果我们想按元值排序,或者通过 WordPress 无法自动理解的其他方式进行排序,您必须告诉它按“切片”排序的含义。如果您通过 post meta 订购,最简单的方法是挂钩 pre_get_posts
操作。这传递了一个我们可以修改的查询对象。请注意,所有默认查询(正面和背面)都会触发此操作。虽然它不太可能引起任何问题,但除非您希望 WordPress 在前端也将 orderby
设置为“切片”,否则最好只在管理端影响查询。
add_action( \'pre_get_posts\', \'my_slice_orderby\' );
function my_slice_orderby( $query ) {
if( ! is_admin() )
return;
$orderby = $query->get( \'orderby\');
if( \'slice\' == $orderby ) {
$query->set(\'meta_key\',\'slices\');
$query->set(\'orderby\',\'meta_value_num\');
}
}
这会检查我们的查询是否按“切片”排序,如果是,它会告诉 WordPress 按“切片”帖子元的值进行数字排序。如果您想按字母顺序对值进行排序,请使用 \'meta_value
\' 而不是 \'meta_value_num
\'。
$query
是一个 WP_Query
对象,因此您可以使用该对象对任何内容进行排序,您也可以对列进行排序。对于其他更复杂的事情,您需要挂钩 posts_orderby
(或 post_clauses
)挂钩,但这超出了本快速提示的范围。
注意:如果帖子没有为该元键存储值,那么当您按该元键排序时,该帖子将不会显示。这与将 0 存储为元值的帖子不同。