Come ottenere l'ID di un custom post type dal suo slug?
È possibile ottenere l'ID di un custom post type utilizzando solo lo slug?
Per quanto ne so, possiamo ottenere l'ID utilizzando il titolo. Ma poiché in un custom post type possono esserci titoli uguali, mentre gli slug sono univoci, è possibile utilizzare lo slug???

Puoi utilizzare get_page_by_path()
- non farti ingannare dal nome, il terzo argomento è il tipo di post:
if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
$id = $post->ID;
else
$id = 0;

La funzione url_to_postid
è molto flessibile: puoi passare qualsiasi tipo di permalink/URL completo e ottenere l'ID del post più accurato per quell'URL. Tuttavia, a causa dell'utilizzo flessibile è piuttosto lenta (soprattutto con molti endpoint/post-type).
Se passi solo uno slug per un specifico post type, è molto più veloce usare get_page_by_path()

Se aspetti un paio di giorni e aggiorni a WordPress 4.4 che sarà rilasciato l'8 dicembre (per quanto ne so), potrai usare il nuovo parametro post_name__in
in WP_Query
che accetta un array di slug
ESEMPIO
Se ti serve l'oggetto post completo
$args = [
'post_type' => 'my_custom_post_type',
'posts_per_page' => 1,
'post_name__in' => ['post-slug']
];
$q = get_posts( $args );
var_dump( $q );
Se ti serve solo l'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 );

Bello, ma probabilmente un po' intensivo per ottenere un post dallo slug? Perché hanno aggiunto questa funzionalità!?

@TheDeadMedic Potrebbe essere un po' intensivo sì, non ho veramente testato le prestazioni su questo, l'ho aggiunto solo come mezzo alternativo ;-). Per quanto riguarda il perché, davvero non lo so, sembra una di quelle cose belle-da-avere-ma-non-necessarie per cui WordPress è così famoso. Anche la convenzione di denominazione, IMHO, è sbagliata, proprio come la proprietà post_name
e il parametro category_name
, che avrebbero dovuto essere slug
e non name

@TheDeadMedic Non c'è differenza di tempo tra il mio metodo e il tuo. Ottengo costantemente tra 0,002 e 0,005 secondi per eseguire ciascuna delle nostre query. Inoltre, entrambi i metodi eseguono solo 1 query. ;-)

Quando ho suggerito che get_page_by_path
è più performante intendevo solo che PHP ha meno lavoro da fare (un po' di parsing degli argomenti e una query SQL) rispetto a WP_Query
(che comporta l'istanziazione di più oggetti e l'esecuzione su molti filtri/azioni/argomenti). I tempi effettivi raramente tendono a illustrare la differenza a meno che non simuliamo migliaia di operazioni. Ma vale la pena sapere che nel mondo reale alla fine non fa differenza ;)
