Snabbtips Gör din anpassade kolumn sorterbar

I en nyartikel av Claudio Simeone visade han hur du kunde lägga till extra kolumner i ditt inlägg, eller anpassade posttyp, adminskärmar (eller ta bort befintliga). I det här snabba tipset bygger jag på det genom att visa dig hur du kan sortera dina nyskapade kolumner.


För att berätta för WordPress vilka kolumner du vill registrera som sorterbar behöver du det här filtret:

 hantera _ $ skärm-> id _sortable_column

För inlägg och sidor, $ Skärm-> id är 'redigera inlägg"och"redigera sida"respektive. I allmänhet för en posttyp med namnet "my-post-typ', det är 'edit-my-post-typ'.

Filtret skickar en matris med namnen på sorterbara kolumner som nycklar, och vad ska man beställa av som ett värde. Närmare bestämt dikterar värdena vad "sortera efter'parametern anges som i frågan som fyller i tabellen. På samma sätt som du kan ta bort kolumner kan du också göra kolumner "osorterbara" genom att ta bort dem från den här rutan. Låt oss se ett exempel:


Registrera en kolumn

Efter Claudios artikel, antar vi att vi har lagt till kolumnen "skivor" till vår "tårta" -typ, vilket vi kan göra enligt följande:

 add_filter ('manage_edit-cake_columns', 'my_extra_cake_columns'); funktion my_extra_cake_columns ($ kolumner) $ kolumner ['skivor'] = __ ('Skivor', 'Myplugindomain'); returnera $ kolumner; 

Och vi har lagt till innehållet för kolumnen på följande sätt:

 add_action ('manage_cake_posts_custom_column', 'my_cake_column_content', 10, 2); funktion my_cake_column_content ($ kolumnnamn, $ post_id) om ('skivor'! = $ kolumnnamn) returnera; // Få antal skivor från posten meta $ skivor = get_post_meta ($ post_id, 'skivor', true); echo intval ($ skivor); 

Jag har lagrat skivor som postmeta, men dina kolumner kan fyllas med andra data.


Gör en kolumn sorterbar

Nu registrerar vi vår anpassade kolumn som "sorterbar". Som nämnts ovan använder vi hantera _ $ skärm-> id _sortable_column filtrera. De $ Skärm-> id i detta fall är "edit-kaka'.

 add_filter ('manage_edit-cake_sortable_columns', 'my_sortable_cake_column'); funktion my_sortable_cake_column ($ kolumner) $ kolumner ['skivor'] = 'skiva'; // För att göra en kolumn 'un-sortable' ta bort den från array // unset ($ kolumner ['date']); returnera $ kolumner; 

Nyckeln till $ kolumner array anger en sorterbar kolumn, och dess värde berättar WordPress vad som ska sättas 'sortera efter'till i frågan. Om det värdet var en av "sortera efterär nationellt förstådd av WordPress (dessa inkluderar "titel','datum','ändrad','COMMENT_COUNT", eller någon av de andra som anges under WP_Query i WordPress Codex) kunde vi stanna här. Undantaget från denna regel, som i det här exemplet, är "meta_value"och"meta_value_num'parametrar, vilket kräver att vi också sätter in en metatangent.

Om vi ​​vill sortera efter ett metavärde, eller på något annat sätt, förstår WordPress inte automatiskt att du måste berätta vad du menar med att beställa av "skiva". Om du beställer via postmeta, är det enklaste sättet att göra det här att haka på pre_get_posts verkan. Detta skickar ett frågeobjekt som vi kan modifiera. Observera att denna åtgärd är avfyrade för alla standardfrågor (fram och bak). Det är osannolikt att det orsakar några problem, om du inte vill att WordPress ska tolka sortera efter inställd på "slice" på frontänden också, det är en bra idé att bara utföra frågor på admin sidan.

 add_action ('pre_get_posts', 'my_slice_orderby'); funktion my_slice_orderby ($ query) om (! is_admin ()) returnera; $ orderby = $ query-> get ('orderby'); om ('skiva' == $ orderby) $ query-> set ('meta_key', 'skivor'); $ Query-> set (orderby ', 'meta_value_num'); 

Detta kontrollerar om vår fråga beställer med "skiva" och om det är, berättar det att WordPress ordnar numeriskt med värdet av skivans postmeta. Om du vill sortera värdet alfabetiskt använd sedan 'meta_value' hellre än 'meta_value_num'.

$ query är en WP_Query objekt, så allt du kan sortera genom att använda det objektet, kan du sortera dina kolumner med. För allt annat mer komplicerat, måste du haka i posts_orderby (eller post_clauses) krok, men det ligger inte inom ramen för denna snabba tips.

Notera: Om ett inlägg inte har ett värde lagrat för den metatangenten kommer det inte att visas när du sorterar efter den metatangenten. Detta skiljer sig från ett inlägg som har 0 lagrat som metavärdet.