web-dev-qa-db-ja.com

高度なカスタムフィールド:カスタムフィールドを使用したカスタム列の並べ替えは日付のみで並べ替えます

私はカスタム投稿タイプ - 「メンバー」を持っています。アドバンストカスタムフィールド(AFC)を使用して、5つのフィールドを含むフィールドグループを作成し、そのグループを自分の「メンバー」投稿タイプに割り当てました。

この記事に従って、「メンバー」のカスタム管理列を作成しました - http://www.elliotcondon.com/advanced-custom-fields-admin-custom-columns/

列を作成しました。

function members_columns($columns){
        $columns = array(
                'cb'        => '<input type="checkbox" />',
                'title'     => 'Name',
                'picture'   => 'Picture',
                'department'=> 'Department',
                'sex'       => 'Sex',
                'featured'  => 'Fixed',
                'staff_order'=> 'Order',
                'date'      => 'Date',
        );
        return $columns;
    }

データを追加します。

function members_custom_columns($column){
        global $post;
        if($column == 'picture'){
            echo wp_get_attachment_image( get_field('picture', $post->ID), array(50,50) );
        }
        elseif($column == 'featured'){
            if(get_field('featured')){
                echo 'Yes';
            } else {
                echo '---';
            }
        }
        elseif($column == 'staff_order'){
            echo get_field('staff_order');
        }
        elseif($column == 'department'){
            echo get_field('department');
        }
        elseif($column == 'sex'){
            echo get_field('sex');
        }
    }

そしてそれらをソート可能にしました:

function members_column_register_sortable( $columns ){
        $columns['featured'] = 'featured';
        $columns['staff_order'] = 'staff_order';
        $columns['department'] = 'department';
        return $columns;
}

そして私のプラグインファイルに含まれているフック:

add_action("manage_posts_custom_column", "members_custom_columns");
add_filter("manage_edit-members_columns", "members_columns");
add_filter("manage_edit-members_sortable_columns", members_column_register_sortable" );

このフィールドグループの対応するフィールドタイプは次のとおりです。

「おすすめ」 - 真偽

「staff_order」 - 番号

「部署」 - 選択

結果:

見た目はそれがあるべきように見えます:写真を含む列を正しく取り込むすべてのデータ、必要な列はソート可能であるように見えます、そして私がヘッダーをクリックするときいくつかのソートが現れます。

問題:

何らかの理由で、ソートは元の「タイトル」および「日付」フィールドに対してのみ正しく機能します。 3つの追加された列(「おすすめ」、「staff_order」、または「部門」)のいずれかで並べ替えると、間違った順序で並べ替えられます。

実験とテストの結果、これら3つのカスタム列のいずれかが発行された順に、つまり「日付」順に並べ替えられることが明らかになりました。

もう1つ注意すべきことは、間違った順序で並べ替えているにもかかわらず、urlパラメータが毎回正しいように見えることです。たとえば、「department」で並べ替えた場合、URLは「/edit.php?post_type=members&orderby=department&order=asc」です。日付順に並べ替えます。

データが正しい順序で返されるかどうかを確認するためにwp_postmetaで同じクエリを実行すると、すべて問題ありません。

助けてください!

1
Acidon

指定しない限り、WordPressが特定の投稿メタで注文する必要があることを理解していないという事実によると思われます。

だから私の場合はこれを追加してソートの問題を修正しました:

add_action( 'pre_get_posts', 'custom_orderby' );
    function custom_orderby( $query ) {
        if( ! is_admin() )
            return;

        $orderby = $query->get( 'orderby');

        if( 'featured' == $orderby ) {
            $query->set('meta_key','featured');
            $query->set('orderby','meta_value');
        }
        elseif ( 'staff_order' == $orderby ) {
            $query->set('meta_key','staff_order');
            $query->set('orderby','meta_value_num');
        }
        elseif ( 'department' == $orderby ) {
            $query->set('meta_key','department');
            $query->set('orderby','meta_value');
        }
    }

Advanced Custom Fieldsコミュニティのメンバーの助けを借りて問題を解決することができました -

http://support.advancedcustomfields.com/forums/topic/sortin-custom-columns-with-custom-fields-sorts-only-by-date/

そして読んで

http://code.tutsplus.com/articles/quick-tip-make-your-custom-column-sortable--wp-25095

1
Acidon