web-dev-qa-db-ja.com

カスタム列をソート可能にする

カスタム投稿タイプにカスタム列を追加しましたが、問題なく動作します。タイトルで名前をつけたいだけなので、これを試してみました、

function sortable_custom_columns( $columns ) {
    $columns['custom_column'] = 'title';
    return $columns;
}
add_filter( 'manage_edit-custom_sortable_columns', 'sortable_custom_columns' );

しかし、それは非常にランダムなソートを返しています。コラムの内容と関係があるのでしょうか。私はこれをこのように表現します。

function location_column_content( $column, $post_id ) {
    switch ( $column ) {
        case 'practice_name':
            $location_post_meta = get_post_meta( $post_id );
            $practice_post_id = $location_post_meta['practice_id'][0];
            echo '<a href="' . get_edit_post_link( $practice_post_id ) . '">' . get_the_title( $practice_post_id ) . '</a>';
            break;
    }

}
add_action( 'manage_sf-location_posts_custom_column', 'location_column_content', 10, 2 );

これは意味がありますか?ここで何か考え?ありがとうございました

2
thatryan

必ずMY_POST_TYPEMY_CUSTOM_COLUMN、およびMY_META_KEYを実際の値に変更してください。

まず、カスタム列を追加します。日付の設定を解除し、最後の列に保存するようにもう一度設定します。あなたはこのステップを飛ばすことができます。

<?php
function my_manage_MY_POST_TYPE_columns( $columns )
{
    // save date to the variable
    $date = $columns['date'];
    // unset the 'date' column
    unset( $columns['date'] ); 
    // unset any column when necessary
    // unset( $columns['comments'] );

    // add your column as new array element and give it table header text
    $columns['MY_CUSTOM_COLUMN'] = __('Custom Column Header Text');

    $columns['date'] = $date; // set the 'date' column again, after the custom column

    return $columns;
}
?>

次に、manage_edit-{$post_type}_sortable_columnsフィルターを使用して列をソート可能にします(まだ文書化されていません)。

<?php
function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
    return $columns;
}
?>

3番目に、列セルを作成します。

<?php
function my_populate_custom_columns( $column, $post_id )
{
    switch ( $column ) {
        case 'MY_CUSTOM_COLUMN':
            echo get_post_meta($post_id, 'MY_META_KEY', true);
            break;
        case 'MAYBE_ANOTHER_CUSTOM_COLUMN':
            // additional code
            break;
    }
}
?>

これで、実際にその列をソートする準備が整いました。

注:空の(存在しない)値についてmeta_queryをチェックしない場合、デフォルトで別の列または別の列でソートされるまで、列に only (空でない)メタ値を持つ投稿が表示されます。

<?php
function my_sort_custom_column_query( $query )
{
    $orderby = $query->get( 'orderby' );

    if ( 'MY_CUSTOM_COLUMN' == $orderby ) {

        $meta_query = array(
            'relation' => 'OR',
            array(
                'key' => 'MY_META_KEY',
                'compare' => 'NOT EXISTS', // see note above
            ),
            array(
                'key' => 'MY_META_KEY',
            ),
        );

        $query->set( 'meta_query', $meta_query );
        $query->set( 'orderby', 'meta_value' );
    }
}
?>

それでは、フィルタとアクションを適用しましょう。あなたがフロントエンドにいないか、右側のページにいないか、そして正しい投稿タイプが選択されているか確認してください。

<?php
global $pagenow;

if ( is_admin() && 'edit.php' == $pagenow && 'MY_POST_TYPE' == $_GET['post_type'] ) {

    // manage colunms
    add_filter( 'manage_MY_POST_TYPE_posts_columns', 'my_manage_MY_POST_TYPE_columns' );

    // make columns sortable
    add_filter( 'manage_edit-MY_POST_TYPE_sortable_columns', 'my_set_sortable_columns' );

    // populate column cells
    add_action( 'manage_MY_POST_TYPE_posts_custom_column', 'my_populate_custom_columns', 10, 2 );

    // set query to sort
    add_action( 'pre_get_posts', 'my_sort_custom_column_query' );
}

?>
4
Max Yudin