2023-09-01

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


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

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

以上就是快速技巧:启用可排序的自定义列的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/600847.html

发表回复

Your email address will not be published. Required fields are marked *