Snelle tip maak je eigen kolom sorteerbaar

In een recent artikel van Claudio Simeone demonstreerde hij hoe je extra kolommen aan je bericht kon toevoegen, of aangepast berichttype, beheerdersschermen (of bestaande verwijderen). In deze snelle tip bouw ik daarop verder door u te tonen hoe u uw nieuw gemaakte kolommen sorteerbaar kunt maken.


Om WordPress te vertellen welke kolommen u als sorteerbaar wilt registreren, heeft u dit filter nodig:

 beheren _ $ scherm-> id _sortable_column

Voor berichten en pagina's, $ Scherm-> id is 'bericht bewerken'en'Pagina bewerken'respectievelijk. In het algemeen voor een berichttype met de naam 'mijn post-type', het is 'bewerk-mijn-na-type'.

Het filter geeft een array door met de namen van sorteerbare kolommen als sleutels en wat als een waarde wordt gesorteerd. Meer bepaald bepalen de waarden wat de 'orderby'parameter is ingesteld zoals in de query die de tabel vult. Op dezelfde manier als u kolommen kunt verwijderen, kunt u kolommen ook ongesorteerd maken door ze uit deze array te verwijderen. Laten we een voorbeeld zien:


Registreer een kolom

Volg Claudio's artikel, stel dat we de kolom 'slices' hebben toegevoegd aan ons 'cake'-berichttype, wat we als volgt kunnen doen:

 add_filter ('manage_edit-cake_columns', 'my_extra_cake_columns'); function my_extra_cake_columns ($ columns) $ columns ['slices'] = __ ('Slices', 'myplugindomain'); return $ kolommen; 

En we hebben de inhoud voor de kolom als volgt toegevoegd:

 add_action ('manage_cake_posts_custom_column', 'my_cake_column_content', 10, 2); function my_cake_column_content ($ column_name, $ post_id) if ('slices'! = $ column_name) return; // Krijg het aantal plakjes van post meta $ slices = get_post_meta ($ post_id, 'slices', true); echo intval ($ slices); 

Ik heb segmenten opgeslagen als post-meta, maar uw kolommen kunnen worden gevuld met andere gegevens.


Maak een kolom sorteerbaar

Nu registreren we onze aangepaste kolom als 'sorteerbaar'. Zoals hierboven vermeld gebruiken we de beheren _ $ scherm-> id _sortable_column filter. De $ Scherm-> id in dit geval is 'bewerk-cake'.

 add_filter ('manage_edit-cake_sortable_columns', 'my_sortable_cake_column'); function my_sortable_cake_column ($ columns) $ columns ['slices'] = 'slice'; // Als u een kolom 'niet sorteerbaar' wilt maken, verwijdert u deze uit de array // unset ($ columns ['date']); return $ kolommen; 

De sleutel van de $ columns array geeft een sorteerbare kolom aan en de waarde ervan vertelt WordPress wat in te stellen 'orderby'in de zoekopdracht. Als die waarde een van de 'orderby's native begrepen door WordPress (deze omvatten'titel','datum','gemodificeerde','COMMENT_COUNT', of zelfs een van de andere vermeld onder WP_Query in de WordPress Codex) kunnen we hier stoppen. De uitzondering op deze regel, zoals in dit voorbeeld, is de 'meta_value'en'meta_value_num'parameters, waarvoor we ook een meta-sleutel moeten instellen.

Als we willen sorteren op een metawaarde, of op een andere manier die WordPress niet automatisch begrijpt, moet je hem vertellen wat je bedoelt door te bestellen op 'slice'. Als u per post-meta bestelt, is de eenvoudigste manier om dit te doen, het aansluiten op de pre_get_posts actie. Dit geeft een query-object door dat we kunnen aanpassen. Houd er rekening mee dat deze actie wordt geactiveerd voor alle standaardquery's (voor- en achterkant). Hoewel het waarschijnlijk geen problemen veroorzaakt, tenzij u wilt dat WordPress interpreteert orderby ingesteld op 'slice' aan de voorkant, is het een goed idee om alleen query's uit te voeren aan de adminzijde.

 add_action ('pre_get_posts', 'my_slice_orderby'); function my_slice_orderby ($ query) if (! is_admin ()) retour; $ orderby = $ query-> get ('orderby'); if ('slice' == $ orderby) $ query-> set ('meta_key', 'slices'); $ Query-> set ( 'orderby', 'meta_value_num'); 

Hiermee wordt gecontroleerd of onze query via 'slice' wordt besteld en als dit het geval is, wordt WordPress numeriek gerangschikt op basis van de waarde van de post-metaplakken. Als u de waarde alfabetisch wilt sorteren, gebruikt u 'meta_value' liever dan 'meta_value_num'.

$ vraag is een WP_Query object, dus alles wat u kunt sorteren door dat object te gebruiken, kunt u sorteren op kolommen. Voor al het andere dat ingewikkelder is, moet je de posts_orderby (of post_clauses) haak, maar dat valt buiten het bereik van deze snelle tip.

Notitie: Als voor een bericht geen waarde is opgeslagen voor die metasleutel, wordt deze niet weergegeven als u sorteert op die metasleutel. Dit is anders dan een bericht met 0 opgeslagen als de metawaarde.