在 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中文网其它相关文章!