Come ottenere l'ID di un custom post type dal suo slug?

3 dic 2015, 12:00:42
Visualizzazioni: 87.4K
Voti: 24

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

0
Tutte le risposte alla domanda 3
0
67

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;
3 dic 2015 12:51:49
2
13

Se vuoi ottenere solo l'ID del post, questa riga di codice fa al caso tuo.

url_to_postid( site_url('the_slug') );
4 nov 2017 00:31:49
Commenti

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

Philipp Philipp
3 mar 2018 01:03:30

Buona soluzione quando non sei sicuro del tipo di post.

gregdev gregdev
19 mar 2022 23:40:52
6

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 );
3 dic 2015 12:59:46
Commenti

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

TheDeadMedic TheDeadMedic
3 dic 2015 14:36:11

@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

Pieter Goosen Pieter Goosen
3 dic 2015 14:48:02

Bello :) wow in realtà per me è un bel aggiornamento :)

stlawrance stlawrance
3 dic 2015 17:32:58

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

Pieter Goosen Pieter Goosen
3 dic 2015 19:10:42

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

TheDeadMedic TheDeadMedic
3 dic 2015 19:23:19

@TheDeadMedic intendevo solo che PHP ha meno lavoro da fare - sì, certo, sono totalmente d'accordo. È semplicemente bello conoscere alternative (anche se a volte potrebbero non essere le migliori) e avere qualche tipo di benchmark. Divertiti ;-)

Pieter Goosen Pieter Goosen
3 dic 2015 19:34:13
Mostra i restanti 1 commenti