Rask tips Gjør din tilpassede kolonne sorterbar

I en nylig artikkel av Claudio Simeone demonstrerte han hvordan du kunne legge til ekstra kolonner i innlegget ditt, eller egendefinert innleggstype, admin skjermbilder (eller fjerne eksisterende). I dette raske tipset bygger jeg på det ved å vise deg hvordan du kan sortere de nyopprettede kolonnene dine.


For å fortelle WordPress hvilke kolonner du vil registrere som sorterbar, trenger du dette filteret:

 administrere _ $ screen> id _sortable_column

For innlegg og sider, $ Skjerm> id er 'Rediger-post'og'Rediger side'henholdsvis. Generelt, for en posttype med navn 'my-post-type', Det er 'edit-my-post-type'.

Filteret passerer en matrise med navnene på sorterbare kolonner som nøkler, og hva som skal bestilles av som en verdi. Nærmere bestemt dikterer verdiene hva "rekkefølge etter'parameteren er satt som i spørringen som fyller tabellen. På samme måte som du kan fjerne kolonner, kan du også gjøre kolonnene usorterbare ved å fjerne dem fra denne gruppen. La oss se et eksempel:


Registrer en kolonne

Etter Claudios artikkel, anta at vi har lagt til kolonnen "skiver" til vår "kake" posttype, som vi kan gjøre som følger:

 add_filter ('manage_edit-cake_columns', 'my_extra_cake_columns'); funksjon my_extra_cake_columns ($ kolonner) $ kolonner ['skiver'] = __ ('Slices', 'myplugindomain'); returnere $ kolonner; 

Og vi har lagt til innholdet for kolonnen som følger:

 add_action ('manage_cake_posts_custom_column', 'my_cake_column_content', 10, 2); funksjon my_cake_column_content ($ column_name, $ post_id) hvis ('skiver'! = $ kolonneavn) returnere; // Få antall skiver fra innleggmeta $ skiver = get_post_meta ($ post_id, 'skiver', sant); ekkoinnstilling ($ skiver); 

Jeg har lagret stykker som postmeta, men kolonnene dine kan fylles av andre data.


Lag en kolonne sorterbar

Nå registrerer vi vår tilpassede kolonne som "sorterbar". Som nevnt ovenfor bruker vi administrere _ $ screen> id _sortable_column filter. De $ Skjerm> id i dette tilfellet er "Rediger-kake'.

 add_filter ('manage_edit-cake_sortable_columns', 'my_sortable_cake_column'); funksjon my_sortable_cake_column ($ kolonner) $ kolonner ['slices'] = 'slice'; // For å lage en kolonne 'un-sortable', fjern den fra array // unset ($ kolonner ['date']); returnere $ kolonner; 

Nøkkelen til $ kolonner array indikerer en sorterbar kolonne, og dens verdi forteller WordPress hva som skal settes 'rekkefølge etter'til i spørringen. Hvis den verdien var en av "rekkefølge etterer forstått av WordPress (disse inkluderer 'tittel','Dato','modifisert','COMMENT_COUNT', eller noen av de andre som er oppført under WP_Query i WordPress Codex), kunne vi stoppe her. Unntaket til denne regelen, som i dette eksemplet, er "meta_value'og'meta_value_num'parametere, som krever at vi også angir en meta nøkkel.

Hvis vi vil sortere etter en metaværdi, eller på en annen måte, forstår WordPress ikke automatisk at du må fortelle det hva du mener ved å bestille med "skive". Hvis du bestiller via postmeta, er den enkleste måten å gjøre dette på å hekte på pre_get_posts handling. Dette passerer et spørringsobjekt som vi kan endre. Merk at denne handlingen er avfyrt for alle standardspørsmål (for og bak). Mens det er usannsynlig å forårsake noen problemer, med mindre du vil at WordPress skal tolke rekkefølge etter satt til "skive" på forsiden også, er det en god ide å bare påvirke spørringer på administrasjonssiden.

 add_action ('pre_get_posts', 'my_slice_orderby'); funksjon my_slice_orderby ($ query) hvis (! is_admin ()) returnerer; $ orderby = $ query-> get ('orderby'); hvis ('slice' == $ orderby) $ query-> sett ('meta_key', 'skiver'); $ Query-> set ( 'orderby', 'meta_value_num'); 

Dette kontrollerer om spørringen vår bestiller med "skive", og hvis det er, forteller det at WordPress rekkefølge numerisk rekkefølge av verdien av "skivens postmeta". Hvis du vil sortere verdien alfabetisk, bruk deretter 'meta_value' heller enn 'meta_value_num'.

$ query er en WP_Query objekt, så alt du kan sortere ved å bruke det objektet, kan du sortere kolonnene dine av. For noe mer komplisert, må du koble inn i posts_orderby (eller post_clauses) krok, men det er ikke ut av dette hurtigtipset.

Merk: Hvis et innlegg ikke har en verdi lagret for den metatasten, vil den ikke vises når du sorterer etter den metatasten. Dette er forskjellig fra et innlegg som har 0 lagret som meta-verdien.