卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章17011本站已运行3323

快速技巧:启用可排序的自定义列

快速技巧:启用可排序的自定义列

在 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 存储为元值的帖子不同。

卓越飞翔博客
上一篇: JavaScript中使用Shepherd构建用户导览的方法
下一篇: 探索 MVC、表单和布局:Yii2 编程指南
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏