Cum obții ID-ul unui post de tip personalizat din slug?
Este posibil să obții ID-ul unui post de tip personalizat doar din slug?
Din câte știu, putem obține ID-ul folosind titlul. Dar pot exista titluri identice într-un tip de postare personalizat, așa că, având în vedere că slug-urile sunt unice, este posibil acest lucru???
Puteți folosi get_page_by_path() - nu lăsați numele să vă înșele, al treilea argument este tipul de postare:
if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
$id = $post->ID;
else
$id = 0;
Funcția url_to_postid este foarte flexibilă: poți transmite orice fel de permalink/URL complet și vei obține cel mai precis ID de post pentru acel URL. Cu toate acestea, din cauza utilizării flexibile, este destul de lentă (mai ales cu multe endpoint-uri/tipuri de postări).
Dacă transmiți doar un slug pentru un anumit tip de postare, este mult mai rapid să folosești get_page_by_path()
Philipp
Dacă aștepți câteva zile și faci upgrade la WordPress 4.4, care va fi lansat pe 8 Decembrie (după informațiile mele), poți folosi noul parametru post_name__in în WP_Query care acceptă un array de slug-uri
EXEMPLU
Dacă ai nevoie de obiectul post complet
$args = [
'post_type' => 'my_custom_post_type',
'posts_per_page' => 1,
'post_name__in' => ['post-slug']
];
$q = get_posts( $args );
var_dump( $q );
Dacă ai nevoie doar de ID
$args = [
'post_type' => 'my_custom_post_type',
'posts_per_page' => 1,
'post_name__in' => ['post-slug'],
'fields' => 'ids'
];
$q = get_posts( $args );
var_dump( $q );
Frumos, dar probabil puțin solicitant pentru a obține un articol după slug? De ce au adăugat această funcționalitate!?
TheDeadMedic
@TheDeadMedic Poate fi puțin solicitant, da, nu am testat cu adevărat performanța la acest capitol, am adăugat-o doar ca o alternativă ;-). Cât despre motiv, chiar nu știu, pare una dintre acele funcționalități "drăguțe-de-avut-dar-inutile" pentru care WordPress este atât de renumit. Convenția de denumire, după părerea mea, este și ea greșită, la fel ca proprietatea post_name și parametrul category_name, care ar fi trebuit să fie slug și nu name
Pieter Goosen
@TheDeadMedic Nu există nicio diferență de timp între metoda mea și metoda ta. Obțin constant între 0,002 și 0,005 secunde pentru a rula fiecare dintre interogările noastre. De asemenea, ambele metode rulează doar 1 interogare. ;-)
Pieter Goosen
Când am sugerat că get_page_by_path este mai performant, mă refeream doar că PHP are mai puțină muncă de făcut (un pic de parsare a argumentelor și o interogare SQL) în comparație cu WP_Query (care implică instanțierea multiplă de obiecte și rularea prin multe filtre/acțiuni/argumente). Timpii reali rareori tind să ilustreze diferența decât dacă simulăm mii de operații. Dar este bine de știut că în lumea reală nu face nicio diferență în final ;)
TheDeadMedic