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()

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 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

@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. ;-)

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 ;)
