✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Hur man ändrar eller lägger till anpassade kolumner i inläggslistan i WordPress Admin

43

WordPress låter dig ändra och lägga till kolumner i listan över inlägg, sidor eller någon anpassad inläggstyp i adminpanelen. I det här inlägget ska vi titta på hur!

Hur man ändrar eller lägger till anpassade kolumner i inläggslistan i WordPress Admin

Det finns två krokar att överväga: ett filter för kolumnens position och rubrik, och en åtgärd för kolumnens utdata för varje inlägg. Stolpetypen är en del av krokarnas namn. Låt oss titta på dem en efter en, börja med filtret.

Kolumnfilter

Filtret för att ändra, ta bort eller lägga till kolumner i inläggslistan i WordPress adminpanel är manage_{$post_type}_posts_columns. Byt {$post_type}med önskad inläggstyp. Till exempel; om du vill redigera kolumner för inläggstyp ’ post’ skulle filternamnet vara manage_post_posts_columns. Och för en anpassad inläggstyp ’ product’ skulle filternamnet vara manage_product_posts_columns.

PS: WordPress har ett kolumnfilter uteslutande för inläggstyp ’ page’: manage_pages_columns, men du kommer att uppnå samma resultat genom att använda filtret manage_page_posts_columns.

Tillhandahålls som argument till filtret får du hela arrayen av alla kolumner för den inläggstypen. Varje kolumn har en unik nyckel och deras värden är etiketterna som visas i kolumnrubriken. Exempel på nycklar är ’ cb’ för kolumnen i kryssrutan och ’ title’ för kolumnen för inläggets rubrik. Ordningen på elementen i arrayen bestämmer ordningen på kolumnerna.

Vad du behöver göra för att lägga till en ny kolumn är helt enkelt att lägga till ett nytt nyckel + värdepar till arrayen och returnera det. Du kan manipulera arrayen som du vill – till exempel ändra ordning på den.

Krok för kolumninnehåll

Vilken krok du behöver använda för att kontrollera utdata från kolumninnehållet beror på om din posttyp är inställd på hierarkisk eller inte. En hierarkisk posttyp har definierats som 'hierarchical' => truei register_post_type. Alla icke-hierarkiska inläggstyper, inklusive WordPress’ inbyggda inläggstyp ’ post’, använder hook-namnet manage_{$post_type}_custom_column. Alla hierarkiska inläggstyper, inklusive WordPress’ inbyggda inläggstyp ’ page’, använder hook-namnet manage_pages_custom_column(obs: ingen injektion av posttypnamn i hook-namnet).

Tillhandahålls som argument till denna krok får du kolumnnamnet, vilket är nyckeln som nämns i kolumnfiltret ovan (t.ex. ’ cb’ för kolumn för kryssruta), och för det andra post-ID. Denna krok körs på varje inlägg, och grundförutsättningen är att du kontrollerar om vi har rätt kolumntyp eller inte (med nyckeln), och om vi gör det, använd inläggs-ID för att hämta inläggsmeta eller liknande och mata ut vad du vill.

Exempel

Låt oss titta på några praktiska exempel.

Lägg till en anpassad kolumn i inlägg som visar en anpassad inläggsmeta

Detta är den enklaste användningen av att lägga till anpassade kolumner. Låt oss säga att vi vill lägga till en anpassad kolumn till inläggstypen "inlägg". Vi vill ha den i slutet av kolumnerna, kallad "Verified", och den ska mata ut "Ja" eller "Nej" beroende på ett anpassat inläggsmetavärde. Obs: Det här exemplet inkluderar inte att spara eller uppdatera den anpassade postmeta.

I vårt functions.phpeller var som helst i vårt tema eller plugin-kod lägger vi till själva kolumnen genom att slå samman den i kolumnmatrisen, och i kroken för kolumnutdata hämtar vi värdet på postmetan och matar ut det.

add_filter('manage_post_posts_columns', function($columns) {
    return array_merge($columns, ['verified' => __('Verified', 'textdomain')]);
});
 
add_action('manage_post_posts_custom_column', function($column_key, $post_id) {
    if ($column_key == 'verified') {
        $verified = get_post_meta($post_id, 'verified', true);
        if ($verified) {
            echo '<span style="color:green;">'; _e('Yes', 'textdomain'); echo '</span>';
        } else {
            echo '<span style="color:red;">'; _e('No', 'textdomain'); echo '</span>';
        }
    }
}, 10, 2);

Utgången kan vara vad du vill, jag lade helt enkelt till en spanrunt utmatningen med olika textfärger för enkel identifiering.

Lägg till en anpassad kolumn till en hierarkisk anpassad inläggstyp som visar dess förfaderinlägg

När en inläggstyp är hierarkisk kan inlägg ha överordnade inlägg. Låt oss säga att vi har en hierarkisk anpassad inläggstyp ’ subject’ för skolämnen där det är en vana att göra inlägg för många barn och till och med barn till barn. För bättre överblick vill vi lägga till en kolumn som visar inläggets förälder ("rotämne”). Om inlägget är ett inlägg på toppnivå, visas ett enkelt ’-’, annars matar kolumnen förfaderns överordnade inläggstitel i en länk för att redigera inlägget.

Eftersom vi hänvisar till en hierarkisk inläggstyp måste vi använda en annan krok för att mata ut kolumninnehåll än exemplet ovan, men processen är exakt densamma.

Den här koden visar också ett exempel på hur man injicerar en kolumn i mitten av kolumnmatrisen. Vi definierar att vår kolumn ska komma före ’författare’ och använder PHP-arrayfunktioner för att injicera elementet i rätt position.

add_filter('manage_subject_posts_columns', function($columns) {
    $offset = array_search('author', array_keys($columns));
    return array_merge(array_slice($columns, 0, $offset), ['ancestor' => __('Ancestor', 'textdomain')], array_slice($columns, $offset, null));
});
 
add_action('manage_pages_custom_column', function($column_key, $post_id) {
    if ($column_key == 'ancestor') {
        $ancestors = get_ancestors($post_id, 'subject', 'post_type');
        $post_ancestor = end($ancestors);
        if ($post_ancestor != 0) {
            echo '<a href="'. get_edit_post_link($post_ancestor). '">'. get_the_title($post_ancestor). '</a>';
        } else {
            echo '-';
        }
    }
}, 10, 2);

Ta bort en kolumn

Att ta bort en kolumn från en inläggstyp är ganska enkelt; allt du behöver är att filtrera postkolumner, ta bort elementet från arrayen och returnera det. Du behöver inte haka i kolumnutgångskroken. Till exempel; tar bort standardkolumnen ’ date’ från inläggstypen ’ post’:

add_filter('manage_post_posts_columns', function($columns) {
    unset($columns['date']);
    return $columns;
});

Ändra standardkolumnernas namn eller position

Låt oss anta att vi har en anpassad inläggstyp ’ book’, och vi vill ersätta standardkolumnnamnet "Author" med "Publisher". Vi filtrerar helt enkelt kolumnfiltret och ger nyckeln ’ author’ ett annat värde:

add_filter('manage_book_posts_columns', function($columns) {
    $columns['author'] = __('Publisher', 'textdomain');
    return $columns;
});

Omordning av kolumner kan göras genom att använda PHP-arrayfunktioner. Tänk på att den resulterande matrisen måste vara en associativ matris med kolumn "ID" som nycklar och deras etikett som värden. Det här är ett enkelt exempel på att ta ut authorkolumnen ’ ’ och sätta den i slutet och på så sätt ändra ordning på kolumnerna:

add_filter('manage_post_posts_columns', function($columns) {
    $taken_out = $columns['author'];
    unset($columns['author']);
    $columns['author'] = $taken_out;
    return $columns;
});

Ställ in en anpassad kolumn som sorterbar

Som standard är vissa av WordPress kolumner sorterbara, till exempel inläggets titel, antal kommentarer och datum. Det är möjligt att göra din anpassade kolumn sorterbar, men det kräver lite mer kod och koppling till WordPresss postfrågekrok för att berätta för WordPress hur man beställer genom din postmeta.

Låt oss anta att vi har en anpassad inläggstyp ’ movie’, och med följande kod lägger vi till en anpassad kolumn som visar den anpassade postmeta ’ duration’.

add_filter('manage_movie_posts_columns', function($columns) {
    return array_merge($columns, ['duration' => __('Duration', 'textdomain')]);
});
 
add_action('manage_movie_posts_custom_column', function($column_key, $post_id) {
    if ($column_key == 'duration') {
        $duration = get_post_meta($post_id, 'duration', true);
        echo (!empty($duration))? sprintf(__('%s minutes', 'textdomain'), $duration): __('Unknown', 'textdomain');
    }
}, 10, 2);

För att berätta för WordPress att vi vill att vår kolumn ska vara sorterbar måste vi koppla in filtret manage_edit-{$post_type}_sortable_columns. Vi lägger till vår kolumn till den filtrerbara kolumnmatrisen och sedan definierar vi vad ’ orderby’-värdet ska vara. Vi anger ett unikt anpassat värde där – samma namn som vår kolumn – som vi kan referera till i vår frågekrok senare.

add_filter('manage_edit-movie_sortable_columns', function($columns) {
    $columns['duration'] = 'duration';
    return $columns;
});

Om du uppdaterar WordPress nu bör du se att vår anpassade kolumn verkligen är klickbar och sorterbar, men den sorterar inte rätt. Det beror på att WordPress inte förstår ’ duration’ som ett ’ orderby’ värde. Det är vad vi fixar genom att koppla in ’ pre_get_posts’:

add_action('pre_get_posts', function($query) {
    if (!is_admin()) {
        return;
    }
    $orderby = $query->get('orderby');
    if ($orderby == 'duration') {
        $query->set('meta_key', 'duration');
        $query->set('orderby', 'meta_value_num');
    }
});

Eftersom vår anpassade inläggsmeta ’ duration’ alltid kommer att vara ett nummer, kan vi definiera ’ orderby’ som ’ meta_value_num’ för nummerjämförelse. Justera frågeargumenten så att de passar dina anpassade inläggsmetavärden.

Inaktivera sortering för standardkolumner

Att inaktivera sortering för en standardkolumn är ganska enkelt. Allt vi behöver göra är att haka i filtret manage_edit-{$post_type}_sortable_columnsoch ta bort kolumnen som vi inte vill sortera på från arrayen. Detta tar till exempel bort sorteringen för datumkolumnen för posttyp ’ post’.

add_filter('manage_edit-post_sortable_columns', function($columns) {
    unset($columns['date']);
    return $columns;
});

Inspelningskälla: awhitepixel.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer