Ordering a specific post type

时间:2016-03-04 作者:Tom

我正在试图找出如何按自定义字段对帖子进行排序。我正在使用一个日历(事件日历),带有一个名为“艺术家”的自定义字段。虽然我的查询请求也会影响所有其他帖子类型,这会导致我的菜单和新闻项消失,但它仍然有效。下面是我现在掌握的代码:

function order_calendar_by_artist( $query ){
   $query->set( \'meta_key\', \'artist\' );
   $query->set( \'orderby\', \'meta_value\' );  

   return $query;
}
add_filter( \'pre_get_posts\', \'order_calendar_by_artist\', 99 );
如果我也设置了post\\u类型,我的主页上也会出现404错误:

function order_calendar_by_artist( $query ){
   $query->set( \'post_type\', \'tribe_events\' );
   $query->set( \'meta_key\', \'artist\' );
   $query->set( \'orderby\', \'meta_value\' );  

   return $query;
}
add_filter( \'pre_get_posts\', \'order_calendar_by_artist\', 99 );

1 个回复
最合适的回答,由SO网友:Kieran McClung 整理而成

Update

我找到了解决方案,首先使用is_main_query(), 然后使用is_post_type_archive( \'tribe_events\' ) 第一个答案中提出的条件陈述。

function order_calendar_by_artist( $query ){    

   if ( is_admin() ||  !$query->is_main_query() ) {
      return;
   }

   if( is_post_type_archive( \'tribe_events\' ) ){
      $query->set( \'meta_key\', \'artist\' );
      $query->set( \'orderby\', \'meta_value\' );
   } 

}
add_filter( \'pre_get_posts\', \'order_calendar_by_artist\', 99 );

Old Answer 2

尝试以下操作(在插件论坛上找到):

function order_calendar_by_artist( $query ) {
    if ( !empty( $query->tribe_is_multi_posttype ) ) {
        $query->set( \'meta_key\', \'artist\' );
        $query->set( \'orderby\', \'meta_value\' ); 
    }
}
add_action( \'pre_get_posts\', \'order_calendar_by_artist\' );
看来您需要找到正确的$query 对于日历插件。你可以一直print_r( $query); 查看该页面上正在运行哪些查询,并相应地调整条件。可能需要一段时间,但这是我在mo能想到的全部。

<小时>

Old answer 1

可以将函数代码封装在条件语句中,如下所示:

function order_calendar_by_artist( $query ) {
    if ( is_post_type_archive( \'tribe_events\' ) ) {
        $query->set( \'meta_key\', \'artist\' );
        $query->set( \'orderby\', \'meta_value\' ); 
    }

    return $query;
}
add_filter( \'pre_get_posts\', \'order_calendar_by_artist\', 99 );
这样做只需调整tribe_events post类型存档页。根据查询需要在何处生效,可能需要调整条件。目前您正在使用pre_get_posts 影响站点上每一个查询的操作,因此您需要深入到您希望运行功能的特定区域(即使用条件)。

您还可以使用以下方法来避免影响管理端

if ( is_post_type_archive( \'tribe_events\' ) && !is_admin() ) {
    ...
}
我还没有实际测试过这个,但它应该可以工作。。。(他说)

否则,您可能需要使用WP_Query() 功能并在需要重新排序帖子的任何位置创建新查询。

$args = array(
    \'post_type\' => \'tribe_events\',
    \'orderby\'   => \'meta_value_num\',
    \'order\'     => \'ASC\', //or DESC
    \'meta_key\'  => \'artist\'
);
$query = new WP_Query( $args );

if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
        //Loop stuff
    endwhile;
endif;
wp_reset_postdata();

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register