Făcând o coloană personalizată sortabilă

6 feb. 2018, 21:32:52
Vizualizări: 27.6K
Voturi: 17

Am adăugat o coloană personalizată la un tip de postare personalizat și funcționează bine. Vreau doar să sortez numele după titlu, așa că am încercat asta,

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

Cu toate acestea, rezultatul este o sortare foarte aleatorie. Cred că ar putea avea legătură cu conținutul coloanei? Pe care îl redau astfel:

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 );

Are sens? Aveți vreo sugestie aici? Mulțumesc

2
Comentarii

Ce se întâmplă dacă folosesc o valoare din item? ex. $item->get_meta( '_st_check_in' ); Cum ai sorta-o?

Daniel Muñoz Daniel Muñoz
9 feb. 2021 19:30:21

@DanielMuñoz nu posta un răspuns ca comentariu ca soluție la întrebare. Înțeleg că ai doar 1 reputație și nu poți comenta încă la întrebările altora, dar asta nu este o scuză pentru a spama site-ul. Dacă vei continua, sistemele automate te vor marca ca spammer și te vor bloca. Nu am putut înțelege la ce comentariu voiai să te referi, așa că l-am mutat la întrebarea în sine

Tom J Nowell Tom J Nowell
9 feb. 2021 20:03:33
Toate răspunsurile la întrebare 4
5
42

Asigură-te să schimbi MY_POST_TYPE, MY_CUSTOM_COLUMN și MY_META_KEY cu valorile reale.

Mai întâi, adaugă coloana personalizată. Elimină data și seteaz-o din nou pentru a o păstra în ultima coloană. Poți sări peste acest pas.

<?php
function my_manage_MY_POST_TYPE_columns( $columns )
{
    // salvează data într-o variabilă
    $date = $columns['date'];
    // elimină coloana 'date'
    unset( $columns['date'] ); 
    // elimină orice coloană când este necesar
    // unset( $columns['comments'] );

    // adaugă coloana ta ca element nou de array și dă-i text pentru antetul tabelului
    $columns['MY_CUSTOM_COLUMN'] = __('Text Antet Coloană Personalizată');

    $columns['date'] = $date; // setează din nou coloana 'date', după coloana personalizată

    return $columns;
}
?>

Apoi, fă coloana sortabilă folosind filtrul manage_edit-{$post_type}_sortable_columns (încă nedocumentat).

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

În al treilea rând, completează celulele coloanei.

<?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':
            // cod suplimentar
            break;
    }
}
?>

Acum ești gata să sortezi efectiv acea coloană.

Notă: dacă nu verifici meta_query pentru valori goale (inexistente), coloana ta va afișa doar postările care au valoare meta (negoală) până când va fi sortată implicit sau după altă coloană

<?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', // vezi nota de mai sus
            ),
            array(
                'key' => 'MY_META_KEY',
            ),
        );

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

Și acum să aplicăm filtrele și acțiunile. Verifică dacă nu ești pe partea de front-end, pe pagina corectă și tipul de postare corect este selectat:

<?php
global $pagenow;

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

    // gestionează coloanele
    add_filter( 'manage_MY_POST_TYPE_posts_columns', 'my_manage_MY_POST_TYPE_columns' );

    // face coloanele sortabile
    add_filter( 'manage_edit-MY_POST_TYPE_sortable_columns', 'my_set_sortable_columns' );

    // completează celulele coloanelor
    add_action( 'manage_MY_POST_TYPE_posts_custom_column', 'my_populate_custom_columns', 10, 2 );

    // setează interogarea pentru sortare
    add_action( 'pre_get_posts', 'my_sort_custom_column_query' );
}

?>
7 feb. 2018 15:54:37
Comentarii

Acest lucru funcționează perfect și astăzi.

MattFisch MattFisch
2 feb. 2022 16:35:23

manage_edit-{$post_type}_sortable_columns este documentat ca manage_{$this->screen->id}_sortable_columns, unde $this->screen->id în acest caz se referă la edit-post, edit-page sau edit-<post_type>.

KittMedia KittMedia
6 mai 2022 11:19:34

O alternativă la utilizarea unui meta_query este să folosești simplu $query->set( 'meta_key' , 'MY_META_KEY' );. Aceasta va evita problema exist/not exists.

Jared Jared
21 dec. 2022 17:11:24

Dacă valorile din coloana personalizată sunt numere, probabil veți dori să utilizați $query->set( 'orderby', 'meta_value_num' ) în loc de $query->set( 'orderby', 'meta_value' ).

Boycott A.I. Boycott A.I.
8 sept. 2023 15:12:34

Sfat: În funcția _sortable_columns, puteți atribui un array cu direcția implicită de sortare ca ['name', false, 'Name'], nu doar șir de caractere, dar nu există documentație pentru această funcționalitate.

ViliusL ViliusL
3 oct. 2023 09:40:36
1

Fă Coloanele Sortabile

În mod implicit, noile coloane personalizate nu sunt sortabile, ceea ce face dificilă găsirea datelor de care aveți nevoie. Pentru a sorta coloanele personalizate, WordPress oferă un alt filtru numit manage_edit-post_sortable_columns pe care îl puteți utiliza pentru a specifica care coloane sunt sortabile.

Când această acțiune este executată, funcția va primi ca parametru toate coloanele care sunt deja sortabile. Adăugând noile coloane personalizate la această listă, acestea vor deveni sortabile. Valoarea pe care o atribuiți va fi utilizată în URL, astfel încât WordPress să înțeleagă după care coloană să ordoneze.

Următorul cod vă permite să sortați după metadatele din coloana personalizată:

// Înregistrează coloana ca sortabilă
function register_sortable_columns( $columns ) {
    $columns['meta'] = 'Coloană Personalizată';
    return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'register_sortable_columns' );
22 iun. 2021 20:14:09
Comentarii

Apreciez efortul pe care l-ai depus în descrierea de aici! Totuși, soluția prezentată pare să repete o bucată de cod care este deja menționată în întrebare ca fiind ineficientă pentru obiectivul lor

bosco bosco
22 iun. 2021 21:49:27
0

Începând cu versiunea WordPress 6.3.0, parametrul $sortable_columns este acum o matrice multidimensională unde poți specifica și abrevieri, text pentru orderby și ordinea inițială de sortare. Aceasta înseamnă că trebuie doar să actualizezi funcția my_set_sortable_columns din exemplul lui Max Yudin de la aceasta:

function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
    return $columns;
}

La aceasta:

function my_set_sortable_columns( $columns )
{
    $columns['MY_CUSTOM_COLUMN'] = array(
        'MY_CUSTOM_COLUMN', // Numele intern al meniului, același cu cheia din matrice
        false, // Ignoră inițializarea sortării implicite
        __('Text Antet Coloană Personalizată'), // Nume scurt al coloanei (abreviere) pentru atributul `abbr`
        __('Tabel sortat după coloană personalizată.') // Șir tradus cu o descriere scurtă pentru sortarea curentă
    );
    return $columns;
}

Dacă dorești să inițializezi ordinea implicită de sortare a coloanei, schimbă pur și simplu al doilea parametru din false în true, și adaugă un al 5-lea parametru cu valoarea asc sau desc astfel:

$columns['MY_CUSTOM_COLUMN'] = array(
    'MY_CUSTOM_COLUMN', // Numele intern al meniului, același cu cheia din matrice
    true, // Inițializează cu ordinea specificată
    __('Text Antet Coloană Personalizată'), // Nume scurt al coloanei (abreviere) pentru atributul `abbr`
    __('Tabel sortat după coloană personalizată.'), // Șir tradus cu o descriere scurtă pentru sortarea curentă,
    'asc' // Inițializează în ordine crescătoare, poate fi și 'desc'
);
31 iul. 2024 18:26:18
1
-1

trebuie să sortezi tabelul folosind pre_get_posts. Instrucțiuni pas cu pas la sfaturi envato

6 feb. 2018 22:09:56
Comentarii

Acesta este un comentariu bun! Majoritatea oamenilor vor trebui să modifice interogarea principală pentru a obține rezultatul dorit de sortare. Răspunsurile de mai sus doar filtrează care coloane sunt PERMISE să fie sortate (nu implementează logica de sortare). Ai nevoie de pre_get_posts!

Chad Reitsma Chad Reitsma
3 feb. 2025 21:47:32