如何在wp admin中按发布元名称排序?


9

我正在尝试按我为帖子添加的帖子元名称进行排序。帖子meta是“ _merchant_id”,我知道如何按merchan_id排序,但我不知道如何按商家名称排序。

我按这样的商家ID进行排序:

public function column_orderby( $vars ) {
        if ( isset( $vars['orderby'] ) && is_admin() ) {
            switch ( $vars['orderby'] ) {
case 'merchant':
 $vars = array_merge( $vars, array(
     'meta_key' => '_merchant_id',
     'orderby' => 'meta_value_num'
 ) );

break;
...

商户是另一种职位类型(“商户”)。如何按商家名称排序?

UPDATE(通过屏幕截图改进说明):

在此处输入图片说明


你读过这个吗?这是相似的,甚至可能更困难。:)
fuxia

@toscho-尝试过。但是我得到的是默认帖子,而不是我的自定义帖子类型“交易”
iWizard 2012年

@toscho-可行。我不知道stackoverflow上的规则,所以不确定是否可以复制此答案,以便为您授予“赏金”吗?我已解决了此问题,因此将来的其他用户可能会发现此问题。
iWizard

2
添加您的特定解决方案作为答案。它可能与链接的答案不完全相同。赏金将丢失。
fuxia

Answers:


3

我假设商家名称是另一个元字段,而不是该帖子类型的标题?如果是这样,这是一种组织您的admin edit.php区域的方法

// Add a column in admin edit.php to display the Merchant post type data you want shown
add_filter('manage_merchant_posts_columns', 'admin_merchant_columns');
function admin_merchant_columns( $posts_columns ) {
    $posts_columns = array(
        'cb' => '<input type="checkbox" />', // the checkbox to select the line item
        'title' => __( 'Name' ), // post title
        'merchant_name' => __( 'Merchant Name' ), // where merchant_name is your meta key for that field
        '_merchant_id' => __( 'Merchant ID' ) // merchant id meta key
    );

    return $posts_columns;
}

// Fill the column with the appropriate items
add_action( 'manage_merchant_posts_custom_column', 'manage_merchant_columns', 10, 2 );
function manage_merchant_columns( $column, $post_id ) {
    global $post;
    switch( $column ) {
        case 'merchant_name' :
            $merchant_name = get_post_meta( $post_id, 'merchant_name'); 
            if ( empty( $merchant_name ) )
                echo ( '' );
            else
                print join( $merchant_name, ', ' );

            break;
        case '_merchant_id' :
            $_merchant_id = get_post_meta( $post_id, '_merchant_id'); 
            if ( empty( $_merchant_id ) )
                echo ( '' );
            else
                print join( $_merchant_id, ', ' );

            break;

        default :
            break;
    }
}

// add ability to sort by merchant name
add_filter( 'manage_edit-merchant_sortable_columns', 'sort_by_merchant_name' );
function sort_by_merchant_name( $columns ) {
    $columns['merchant_name'] = 'merchant_name';
    return $columns;
}

add_action( 'load-edit.php', 'sort_by_merchant_name_load' );
function sort_by_merchant_name_load() {
    add_filter( 'request', 'sort_merchant' ); // where "merchant" is your custom post type slug
}

function sort_merchants( $vars ) {
    if ( isset( $vars['post_type'] ) && 'merchant' == $vars['post_type'] ) { // where "merchant" is your custom post type slug
        if ( isset( $vars['orderby'] ) && 'merchant_name' == $vars['orderby'] ) {
            $vars = array_merge(
                $vars,
                array(
                    'meta_key' => 'merchant_name',
                    'orderby' => 'meta_value'
                )
            );
        }
    }
    return $vars;
}

克里斯蒂娜,我通过添加屏幕截图更新了说明。请看一下。
iWizard

默认情况下,帖子标题应该是可排序的……您不必做任何特殊的事情就可以使它工作。介意发布您的cpt /分类注册代码?
kristina childs

我没有代码,因为这是在某些插件中实现的。我有一些交易(帖子类型),这些交易已在postmeta中保存了他们的商人ID,然后通过那个商人ID我连接到了商人(帖子类型)。我如何在wp admin中按商家名称处理打印页面排序(DESC / ASC)?
iWizard

1
回调和函数名称在前两个钩子中不匹配...
brasofilo 2012年

1
还是那样。抱歉,我从现有的wordpress网站之一进行了修改,一定错过了。谢谢@brasofilo。@CroiOS,现在我修复了该错字后,请再次尝试代码。(使用post_title)代替merchant_type
kristina childs 2012年

3

默认情况下,元数据值和名称在管理区域中不可用。

但是您可以增强查询以便在循环中使用它,该查询就像您问题中的示例一样。要添加元值,请使用插件中的以下小片段。

add_filter( 'query_vars', 'fb_query_vars_admin' );
/**
 * If needed: Allow meta queries in the admin
 */
function fb_query_vars_admin( $query_vars ) {

    // break off, if not in admin area
    if ( ! is_admin() )
        return $query_vars;

    $query_vars[] = 'meta_key'; // my key of custom field
    $query_vars[] = 'meta_value'; // my value of custom field

    return $query_vars;
}

另一种选择是挂接查询并直接更改查询。

add_filter( 'parse_query', 'fb_custom_post_sort' );
function fb_custom_post_sort($query) {

    if ( ! is_admin() )
        return $query;

    global $current_screen;
    if ( isset( $current_screen ) && 'post' === $current_screen->post_type ) {
        $query->query_vars['orderby']  = 'meta_value';
        $query->query_vars['meta_key'] = '_merchant_id';
        $query->query_vars['order']    = 'ASC';
    }
}

1
商家名称(他要排序的位)不是meta键,而是帖子标题。奇怪的是,他使用的插件会禁用该功能。
kristina childs

0

我希望我的解决方案对某人有用。

 public function column_orderby( $vars ) {


        if ( isset( $vars['orderby'] ) && is_admin() ) {
            switch ( $vars['orderby'] ) {

            ...

            case 'merchant':


                GLOBAL $wpdb, $query;


                $vars = array_merge( 
                    $vars, array(
                    'meta_key' => '_merchant_id',
                    'orderby' => 'meta_value_num'
                    ) 
                );

                add_filter('posts_clauses', 'e_order_by_mechant_name',10,2);


                break;

            ...
        }

        return $vars;
}


function e_order_by_mechant_name( $clauses, $query ) {
    global $wpdb;
    if ( ! $query->is_main_query()
        || ! is_admin()

    ){
        return $clauses;
    }

    //Get sort order
    $order_dir = $query->get('order');
    $order_dir = ('asc' == $order_dir ? 'ASC' : 'DESC');

    //Join user table onto the postmeta table
    $clauses['join'] .= " LEFT JOIN {$wpdb->prefix}posts merchants ON {$wpdb->prefix}postmeta.meta_value = merchants.ID";

    //Replace orderby
    $clauses['orderby']  = " merchants.post_title $order_dir";

    return $clauses;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.