Vycházejme z toho, že máme vlastní typ příspěvku (CPT), třeba course. Ukládáme tak školení. Každý příspěvek má vlastní uživatelská pole (custom fields, CF), mezi nimi také datum, kdy školení začíná. Jak ho zobrazit v přehledu všech školení?
Tam se totiž zobrazuje jen datum vytvoření samotného příspěvku, nikoliv další datum, které jsme si připojili a má význam jen pro nás (nikoliv pro WordPress). A abychom to měli ještě praktičtější, což takhle si zobrazit i místo konání?
Každý záznam o školení má kromě běžného názvu a popisu také další pole:
- Místo školení
- Od (datum)
- Do (datum)
- Od (čas)
- Do (čas)
- Stav (volno, obsazeno, archivováno)
Do přehledu všech školení tedy chceme přidat doplňující sloupce, které nám na první pohled poskytnou více informací.
Úprava kódu
Změn dosáhneme použitím vlastních rutin pro hooky. Oba hooky mají svůj název odvozený od názvu vašeho CPT. Zde je použit CPT courses, místo něj dosaďte svůj, názvy použitých hooků jsou
manage_courses_posts_columns
– vytvoření sloupcůmanage_courses_posts_custom_column
– plnění sloupců daty
Přidání sloupce
Naše rutina přidá do pole sloupců další dva se záhlavím Datum konání a Místo:
add_action( 'manage_courses_posts_columns' , 'crs_display_date_column'); function crs_display_date_column( $columns ) { return array_merge($columns, array( 'course_date' => 'Datum konání', 'course_place' => 'Místo' ) ); }
Zobrazení dat ve sloupci
Při navěšování této rutiny na hook určujeme, že má vyšší prioritu (10) a má dva argumenty. Rutina se spouští na každý prvek pole ve sloupci, pokaždé tedy získáváme data konkrétního z nich (ano, i těch již existujících). Odchytneme si tedy podmínkou ta naše a pomocí $post_id (šla by použít i globální proměnná $post) načteme požadovaná custom fields (date_from, date_to, place), která ukládáme při vytváření příspěvku (na obrázku výše). V případě, že se datum konce školení liší od začátku, zobrazíme je jako interval.
add_action( 'manage_courses_posts_custom_column' , 'crs_custom_courses_column', 10, 2 ); function crs_custom_courses_column( $column, $post_id ) { switch ( $column ) { case 'course_date' : $datef = sanitize_text_field(get_post_meta($post_id, 'date_from', true)); $datet = sanitize_text_field(get_post_meta($post_id, 'date_to', true)); /* Zde předpokládáme, že datum je uloženo jako řetězec, což je sice špatně, ale pro ukázkový příklad to postačuje; no.. někdy i pro praxi ;-) */ echo($datef); if ((!empty($datet)) AND (strcmp($datef, $datet) !== 0)) { echo('–' . $datet); } break; case 'course_place': $place = sanitize_text_field(get_post_meta($post_id, 'place', true)); echo($place); } }
Tento kód se umisťuje do samostatného pluginu nebo do functions.php v šabloně. Samozřejmě by ho šlo rozvíjet a vymýšlet další vylepšení, ale o tom až jindy.