wp adminで投稿メタ名で注文する方法は?


9

投稿用に追加した投稿メタ名で注文しようとしています。投稿メタは「_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;
...

商人は別の投稿タイプ(「商人」)です。販売者名で並べ替えるにはどうすればよいですか?

更新(スクリーンショットによる説明の改善):

ここに画像の説明を入力してください


これを読みましたか?それは似ていましたが、おそらくもっと難しいでしょう。:)
fuxia

@toscho-試しました。ただし、カスタムの投稿タイプ「取引」ではなく、デフォルトの投稿を取得します
iWizard

@toscho-これは機能します。ここでのスタックオーバーフローのルールがわからないので、この回答をコピーして「バウンティ」を授与できるかどうかわかりません。私はこの問題を解決したので、将来的に他のユーザーが役立つと思うでしょう。
iWizard

2
特定のソリューションを回答として追加します。おそらくリンクされた回答とまったく同じではありません。賞金は失われます。
fuxia

回答:


3

販売者名は別のメタフィールドであり、その投稿タイプのタイトルではないと思いますか?もしそうなら、これはあなたの管理者の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 / taxonomyの登録コードを投稿してもよろしいですか?
クリスティーナチャイルズ

これは一部のプラグインに実装されているため、コードを記述していません。私はpostmetaにマーチャントIDを保存したディール(ポストタイプ)を持っていますが、そのマーチャントIDを介してマーチャント(ポストタイプ)に接続します。どのようにすれば、WP管理者は商人の名前で印刷ページソート(DESC / ASC)を処理できますか
iWizard 2012

1
最初の2つのフックでコールバックと関数の名前が一致しません...
brasofilo

1
またはそれがあります。申し訳ありませんが、既存のワードプレスサイトの1つから変更しましたが、見逃していたに違いありません。@brasofiloに感謝します。@CroiOS、タイプミスを修正したので、コードをもう一度試してください。(post_title)の代わりにmerchant_type)を使用
kristina childs

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
マーチャント名(彼がソートしたいビット)はメタキーではなく、投稿のタイトルです。彼が使用するプラグインがその機能を無効にするのは奇妙です。
クリスティーナの子供

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.