Classificar tabela de lista de tipos de postagem personalizada pelo nome de exibição de um ID de usuário armazenado como pós meta valor

4

Eu tenho um tipo de postagem personalizada chamado domicile . Cada post (domicílio) tem um proprietário (não o autor ). Proprietários são usuários com uma função personalizada. Eu armazeno o id do usuário como um valor pós-meta ( dmb_owner ) para o tipo% post domicile .

Como classifico a tabela da lista ( wp-admin/edit.php?post_type=domicile ) pelos nomes de exibição dos proprietários?

O código relevante da minha turma, setup_columns() é chamado em init :

/**
 * Manage columns for List Table.
 *
 * @wp-hook init
 * @return void
 */
protected function setup_columns()
{
    add_filter(
        "manage_edit-{$this->post_type}_columns",
        array ( $this, 'set_column_header' )
    );

    add_action(
        "manage_{$this->post_type}_posts_custom_column",
        array ( $this, 'render_columns' ),
        10,
        2
    );

    add_filter(
        "manage_edit-{$this->post_type}_sortable_columns",
        array ( $this, 'set_sortable_columns' )
    );

    add_filter(
        'request',
        array ( $this, 'prepare_orderby' )
    );
}

/**
 * Register column headers.
 *
 * @wp-hook manage_edit-{$this->post_type}_columns
 * @param  array $columns
 * @return array
 */
public function set_column_header( $columns )
{
    unset (
        $columns['author'],
        $columns['comments'],
        $columns['date']
    );
    $columns['owner'] = __( 'Owner', 't5_domicile_manager' );

    return $columns;
}

/**
 * Display cell content.
 *
 * @wp-hook manage_{$this->post_type}_posts_custom_column
 * @param string $column_name
 * @param int $post_id
 * @return void
 */
public function render_columns( $column_name, $post_id = 0 )
{
    if ( 'owner' === $column_name )
    {
        $owner_id = get_post_meta( $post_id, 'dmb_owner', TRUE );
        if ( $owner_id )
        {
            $owner = get_user_by( 'id', $owner_id );
            print $owner ? $owner->display_name : '<i>not set</i>';
        }
    }
}

/**
 * Register sortable columns
 *
 * @wp-hook manage_edit-{$this->post_type}_sortable_columns
 * @param array $columns
 * @return array
 */
public function set_sortable_columns( $columns )
{
    $columns['owner'] = 'owner';
    return $columns;
}

/**
 * Set custom sort order.
 *
 * @wp-hook request
 * @param  array $vars
 * @return array
 */
public function prepare_orderby( $vars )
{
    if ( isset ( $vars['orderby'] ) && 'owner' == $vars['orderby'] )
    {
        $vars = array_merge(
            $vars,
            array (
                'meta_key' => 'dmb_owner',
                'orderby'  => 'meta_value_num'
            )
        );
    }
    return $vars;
}

Isso… funciona, mas é obviamente errado, porque é classificado pelo ID armazenado. Eu tenho que filtrar a consulta - mas não tenho certeza de como exatamente devo fazer isso.

Desculpe pelo título, mas quero ter certeza de que isso será encontrado. Eu procurei muito e não achei nada útil.

    
por fuxia 16.07.2012 / 09:09

2 respostas

6

Uma solução "fácil", mas não muito boa, é armazenar o nome de exibição do usuário, bem como o ID, e ordenar por isso. Obviamente, uma atualização do nome de exibição de um usuário solicitaria uma atualização de todo o domicílio que o usuário possui.

Alternativamente, o seguinte é um esboço (não testado) do que deve funcionar. A idéia é dizer ao WordPress para ordenar pelo valor meta ainda (para que o WordPress se junte à meta-tabela do post) e então é possível usar o filtro post_clauses para unir a tabela users e classificar pelo nome de exibição:

add_filter('posts_clauses', 'wpse58638_post_clauses',10,2);
function wpse58638_post_clauses( $clauses, $query ) {
    global $wpdb;
    if ( ! $query->is_main_query()
        || ! is_admin()
        || ! $query->get('post_type') == 'domicile'
        || ! $query->get('meta_key') == 'dmb_owner'
        || ! $query->get('orderby') == 'meta_value_num'
    ){
        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->users} ON {$wpdb->prefix}postmeta.meta_value={$wpdb->users}.ID";

    //Replace orderby
    $clauses['orderby']  = " {$wpdb->users}.display_name $order_dir";

    return $clauses;
}
    
por Stephen Harris 16.07.2012 / 12:26
0

Você pode adicionar o campo personalizado dmb_owner à consulta no back-end e, em seguida, pode filtrar isso com seus filtros padrão.

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[] = 'dmb_owner'; // my key of custom field
    //$query_vars[] = 'meta_value'; // my value of custom field

    return $query_vars;
}

Agora é esse campo personalizado dentro do $query_vars e pode ser usado, como seu método prepare_orderby() .

    
por bueltge 16.07.2012 / 10:04