Adăugare coloană personalizată sortabilă după taxonomie în WordPress

14 aug. 2013, 01:14:17
Vizualizări: 13.6K
Voturi: 8

Încerc să adaug o coloană personalizată în tabelul de afișare al postărilor pentru un tip de postare personalizată în panoul de administrare.

Am citit numeroase întrebări/răspunsuri pe WPSE, precum și acest articol. Totuși, se pare că toată lumea vrea să interogheze după cheie/valoare meta.

Eu încerc să adaug o valoare de taxonomie (în esență o categorie) în tabelul tipului de postare personalizată.

Aș dori ca coloana să fie sortabilă, dar nu înțeleg cum să ajustez interogarea.

Adăugarea titlului coloanei:

function mbe_column_titles($columns){
    $columns['title'] = 'Întrebare frecventă';
    $columns['mbe-faq-category'] = 'Categorie';
    return $columns;
}
add_filter('manage_mbe-faqs_posts_columns', 'mbe_column_titles');

Adăugarea valorilor rândurilor:

function mbe_column_rows($column_name, $post_id){
    if($column_name == 'mbe-faq-category'){
        $categories = wp_get_object_terms($post_id, 'mbe-faq-categories');
        $the_category = array();
        if($categories){
            foreach($categories as $category){
                $the_category[] = $category->name;
            }
        }
        echo join(', ', $the_category);
    }
}
add_action('manage_mbe-faqs_posts_custom_column', 'mbe_column_rows', 10, 2);

Pregătirea cheii de ordonare:

function mbe_sortable_columns($columns){
    $columns['mbe-faq-category'] = 'mbe-faq-category';
    return $columns;
}
add_filter('manage_edit-mbe-faqs_sortable_columns', 'mbe_sortable_columns');

Sunt blocat la partea de sortare efectivă a coloanei după Categoria FAQ. Presupun că ar trebui să fie o interogare de taxonomie. Sunt prea rușinat să postez încercările mele, iar tot ce încerc eșuează. Aș dori să folosesc filtrul pre_get_posts pentru a gestiona acest lucru, dacă este posibil.

4
Comentarii

Uau, după ce am făcut acest post, am observat Coloane sortabile în administrare, când datele nu vin din post_meta în secțiunea de articole similare. Îmi cer scuze pentru că nu am căutat mai bine înainte de a întreba, acesta ar putea fi un duplicat. Totuși, un răspuns direct ar fi în afara site-ului... Coloane de taxonomii sortabile, de Scribu

Michael Ecklund Michael Ecklund
14 aug. 2013 01:17:11

Versiunea 3.5 a adăugat show_admin_column argumentul la register_taxonomy care practic face toate acestea pentru tine, nu este nevoie să le faci manual.

Milo Milo
21 oct. 2013 18:23:02

@Milo Mulțumesc pentru menționare! Nu eram conștient de acest parametru. Cu siguranță face lucrurile mult mai simple. Totuși, nu pare să fie sortabil cu metoda ta. Metoda ta se ocupă de pașii 1 și 2 din răspunsul meu.

Michael Ecklund Michael Ecklund
21 oct. 2013 18:34:23

ah, adevărat, îți permite să filtrezi după termen, dar nu să ordonezi după termen.

Milo Milo
21 oct. 2013 18:35:58
Toate răspunsurile la întrebare 2
0
22

Pentru a adăuga o coloană personalizată sortabilă în WP_List_Table al tipului tău de postare în panoul de administrare WordPress, va trebui să faci următoarele:

  1. Înlocuiește toate aparițiile lui YOUR-POST-TYPE-NAME cu numele real al tipului tău de postare.
  2. Înlocuiește toate aparițiile lui YOUR-TAXONOMY-NAME cu numele real al taxonomiei tale.
  3. Înlocuiește toate aparițiile lui YOUR COLUMN NAME cu numele real al coloanei tale.
  4. Înlocuiește toate aparițiile lui YOUR-COLUMN-SLUG cu slug-ul real al coloanei tale.

Pasul 1

Adaugă Coloane Adiționale în Tabelul de Administrare WordPress

if(!function_exists('mbe_change_table_column_titles')){
    function mbe_change_table_column_titles($columns){
        unset($columns['date']);// elimină temporar, pentru a avea coloana personalizată înaintea coloanei de dată
        $columns['YOUR-COLUMN-SLUG'] = 'YOUR COLUMN NAME';
        $columns['date'] = 'Dată';// readaugă coloana de dată
        return $columns;
    }
    add_filter('manage_YOUR-POST-TYPE-NAME_posts_columns', 'mbe_change_table_column_titles');
}

Pasul 2

Adaugă Toți Termenii de Taxonomie Asociați ca Date de Rând în Coloana Personalizată WordPress

if(!function_exists('mbe_change_column_rows')){
    function mbe_change_column_rows($column_name, $post_id){
        if($column_name == 'YOUR-COLUMN-SLUG'){
            echo get_the_term_list($post_id, 'YOUR-TAXONOMY-NAME', '', ', ', '').PHP_EOL;
        }
    }
    add_action('manage_YOUR-POST-TYPE-NAME_posts_custom_column', 'mbe_change_column_rows', 10, 2);
}

Pasul 3

Activează Coloana Personalizată WordPress pentru a fi Sortabilă

if(!function_exists('mbe_change_sortable_columns')){
    function mbe_change_sortable_columns($columns){
        $columns['YOUR-COLUMN-SLUG'] = 'YOUR-COLUMN-SLUG';
        return $columns;
    }
    add_filter('manage_edit-YOUR-POST-TYPE-NAME_sortable_columns', 'mbe_change_sortable_columns');
}

Pasul 4

Modifică post_clauses pentru a Permite Sortarea Coloanelor Personalizate după un Termen de Taxonomie

if(!function_exists('mbe_sort_custom_column')){
    function mbe_sort_custom_column($clauses, $wp_query){
        global $wpdb;
        if(isset($wp_query->query['orderby']) && $wp_query->query['orderby'] == 'YOUR-COLUMN-SLUG'){
            $clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= "AND (taxonomy = 'YOUR-TAXONOMY-NAME' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC)";
            if(strtoupper($wp_query->get('order')) == 'ASC'){
                $clauses['orderby'] .= 'ASC';
            } else{
                $clauses['orderby'] .= 'DESC';
            }
        }
        return $clauses;
    }
    add_filter('posts_clauses', 'mbe_sort_custom_column', 10, 2);
}

Pasul 5 (BONUS)

Ajustează Lățimea Coloanelor Personalizate WordPress

if(!function_exists('mbe_print_admin_styles')){
    function mbe_print_admin_styles(){
        if(!is_admin()){
            return false;
        }
        global $pagenow;
        if($pagenow == 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] == 'YOUR-POST-TYPE-NAME'){
            echo '
        <style type="text/css">
            .column-YOUR-COLUMN-SLUG{
                width: 10%;
            }
        </style>
        '.PHP_EOL;
        }
    }
    add_action('wp_print_scripts', 'mbe_print_admin_styles');
}

Mulțumiri lui @goto10 pentru întrebarea Coloane de administrare sortabile, când datele nu provin din post_meta și lui @scribu pentru postarea Coloane Personalizate Sortabile și Coloane de Taxonomie Sortabile pentru acest răspuns la întrebarea originală Coloană Personalizată Sortabilă prin Interogare de Taxonomie.

21 oct. 2013 18:13:31
0
-2

Acest lucru poate fi realizat mult mai ușor cu un singur filtru:

/**
 * Sortare după Termen din Taxonomie
 *
 * Adaugă sortarea pe coloană pentru o taxonomie personalizată în vizualizarea de editare a unui tip de postare personalizat în WordPress.
 *
 * Notă: Înlocuiește valorile {post_type} și {taxonomy} de mai jos.
 */
add_filter( 'manage_edit-{post_type}_sortable_columns', function( $sortable_columns ) {
  $sortable[ 'taxonomy-{taxonomy}' ] = ['orderby', 'asc'];
  return $sortable;
}, 10, 1 );

Înlocuiește {post_type} și {taxonomy} cu tipul de postare și taxonomia cu care lucrezi. Rezultatul final va fi o coloană personalizată în tipul tău de postare care poate fi sortată și poate fi utilizată pentru a sorta postările în WP_List_Table.

10 sept. 2020 17:54:32