Wordpress:按自定义帖子类型的列进行默认排序
我有一个名为Contact的自定义post类型,带有诸如名字、姓氏、电话号码等自定义字段 在管理部分,我认为它们是按时间顺序排序的,但我需要它们默认按姓氏排序 我已经阅读了这里的所有其他解决方案,但没有一个有效,包括:Wordpress:按自定义帖子类型的列进行默认排序,wordpress,sorting,Wordpress,Sorting,我有一个名为Contact的自定义post类型,带有诸如名字、姓氏、电话号码等自定义字段 在管理部分,我认为它们是按时间顺序排序的,但我需要它们默认按姓氏排序 我已经阅读了这里的所有其他解决方案,但没有一个有效,包括: function set_post_order_in_admin( $wp_query ) { global $pagenow; if ( is_admin() && 'edit.php' == $pagenow && !isset($_GET
function set_post_order_in_admin( $wp_query ) {
global $pagenow;
if ( is_admin() && 'edit.php' == $pagenow && !isset($_GET['orderby'])) {
$wp_query->set( 'orderby', 'surname' );
$wp_query->set( 'order', 'ASC' );
}
}
add_filter('pre_get_posts', 'set_post_order_in_admin' );
但无论我尝试按哪个字段排序,都不会发生任何变化,除了切换ASC/DESC似乎会改变为逆时间顺序
我做错了什么?替换
$wp_query->set( 'orderby', 'surname' );
$wp_query->set( 'order', 'ASC' );
与
它可能有助于参考以下解决方案
function wpa84258_admin_posts_sort_last_name( $query ){
global $pagenow;
if( is_admin()
&& 'edit.php' == $pagenow
&& !isset( $_GET['orderby'] )
&& !isset( $_GET['post_type'] ) ){
$query->set( 'meta_key', 'last_name' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
}
}
add_action( 'pre_get_posts', 'wpa84258_admin_posts_sort_last_name' );
或者参考此我是一名drupal开发人员,没有机会使用WordPress。 我们也有同样的问题,这就是我们解决问题的方法 获取自定义内容类型数据(WP默认api或自定义查询),它将是一个对象数组。使用下面的函数对它们进行排序。返回已排序的帖子数组。不确定,您需要在wordpress的哪个钩子中实现这个
/**
* Function to sort array by key
* sortArrayByKey($yourArray,"name",true); //String sort (ascending order)
* sortArrayByKey($yourArray,"name",true,false); //String sort (descending order)
* sortArrayByKey($yourArray,"id"); //number sort (ascending order)
* sortArrayByKey($yourArray,"count",false,false); //number sort (descending order)
*/
function sortArrayByKey(&$array, $key, $string = false, $asc = true)
{
if ($string) {
usort($array, function ($a, $b) use (&$key, &$asc) {
if ($asc) return strcmp(strtolower($a{$key}), strtolower($b{$key}));
else return strcmp(strtolower($b{$key}), strtolower($a{$key}));
});
} else {
usort($array, function ($a, $b) use (&$key, &$asc) {
if ($a[$key] == $b{$key}) {
return 0;
}
if ($asc) return ($a{$key} < $b{$key}) ? -1 : 1;
else return ($a{$key} > $b{$key}) ? -1 : 1;
});
}
}
从该答案复制的函数:此代码段将'Name'列设置为Woocommerce产品的默认排序顺序(升序)
function sort_woocommerce_products_by_name( $query ){
global $pagenow;
if( is_admin()
&& 'edit.php' == $pagenow
&& isset($_GET['post_type']) && $_GET['post_type']=='product'
&& !isset( $_GET['orderby'] ) ){
$query->set( 'orderby', 'title' );
$query->set( 'order', 'asc' );
}
}
add_action( 'pre_get_posts', 'sort_woocommerce_products_by_name' );
同样的事情也发生在我身上。如果你的条件不对。删除ifs后,请先尝试执行此操作。@Junaid请查看此操作。我以前错过了这个,但感谢上帝,我现在试过了。对于自定义的帖子类型,请替换
!isset($\u GET['post\u type'])
由@$\u GET['post\u type']='my\u custom\u type'
(或类似的东西)设置,并且要按菜单顺序进行排序(这是一个post属性而不是一个meta),去掉'meta\u键'
行,使用$query->set('orderby',menu order')代码>。虽然您的代码可以工作,但它不能回答问题
return $this->sortArrayByKey($posts, "surname");
function sort_woocommerce_products_by_name( $query ){
global $pagenow;
if( is_admin()
&& 'edit.php' == $pagenow
&& isset($_GET['post_type']) && $_GET['post_type']=='product'
&& !isset( $_GET['orderby'] ) ){
$query->set( 'orderby', 'title' );
$query->set( 'order', 'asc' );
}
}
add_action( 'pre_get_posts', 'sort_woocommerce_products_by_name' );