¿Cómo obtener el ID de una entrada de tipo de publicación personalizada desde el slug?

3 dic 2015, 12:00:42
Vistas: 87.4K
Votos: 24

¿Es posible obtener el ID de una entrada de tipo de publicación personalizada (custom post type) solamente desde el slug?

Por lo que sé, podemos obtenerlo desde el ID usando el título. Pero puede haber títulos iguales en un tipo de publicación personalizada, así que como los slugs son únicos, ¿es posible???

0
Todas las respuestas a la pregunta 3
0
67

Puedes utilizar get_page_by_path() - no te dejes engañar por el nombre, el tercer argumento es el tipo de publicación:

// Verificar si existe un post con el slug 'the_slug' en el post_type especificado
if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
    // Si existe, obtener el ID del post
    $id = $post->ID;
else
    // Si no existe, asignar 0 como ID
    $id = 0;
3 dic 2015 12:51:49
2
13

Si solo deseas obtener el ID de la publicación, esto hará el truco en una línea.

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

La función url_to_postid es muy flexible: puedes pasar cualquier tipo de enlace permanente/URL completa y obtener el ID de publicación más preciso para esa URL. Sin embargo, debido a su uso flexible, es bastante lenta (especialmente con muchos endpoints/tipos de contenido). Si solo pasas un slug para un tipo de contenido específico, es mucho más rápido usar get_page_by_path()

Philipp Philipp
3 mar 2018 01:03:30

Buena solución para cuando no estás seguro del tipo de contenido.

gregdev gregdev
19 mar 2022 23:40:52
6

Si esperas un par de días y actualizas a WordPress 4.4 que será lanzado el 8 de diciembre (hasta donde sé), podrás usar el nuevo parámetro post_name__in en WP_Query que acepta un array de slugs

EJEMPLO

Si necesitas el objeto completo del post

$args = [
    'post_type'      => 'my_custom_post_type',
    'posts_per_page' => 1,
    'post_name__in'  => ['post-slug']
];
$q = get_posts( $args );
var_dump( $q );

Si solo necesitas el 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
Comentarios

Bien, pero probablemente sea un poco intensivo para obtener una entrada por slug. ¿Por qué añadieron esa función!?

TheDeadMedic TheDeadMedic
3 dic 2015 14:36:11

@TheDeadMedic Puede que sea un poco intensivo, sí, realmente no he probado el rendimiento en esto, solo lo agregué como una alternativa ;-). En cuanto al por qué, realmente no lo sé, parece una de esas cosas agradables-pero-innecesarias por las que WordPress es tan famoso. La convención de nombres, en mi opinión, también es incorrecta, al igual que la propiedad post_name y el parámetro category_name, que deberían haber sido slug y no name

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

¡Bien :) Guau, en realidad para mí es una actualización interesante :)

stlawrance stlawrance
3 dic 2015 17:32:58

@TheDeadMedic No hay diferencia de tiempo entre mi método y el tuyo. Constantemente obtengo entre 0.002 y 0.005 segundos para ejecutar cada una de nuestras consultas. Además, ambos métodos ejecutan solo 1 consulta. ;-)

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

Cuando sugerí que get_page_by_path tiene mejor rendimiento, solo me refería a que PHP tiene menos trabajo que hacer (un poco de análisis de argumentos y una consulta SQL) comparado con WP_Query (que implica múltiples instanciaciones de objetos y pasar por muchos filtros/acciones/argumentos). Las mediciones reales rara vez tienden a ilustrar a menos que simulemos miles de operaciones. Pero vale la pena saber que en el mundo real al final no hace diferencia ;)

TheDeadMedic TheDeadMedic
3 dic 2015 19:23:19

@TheDeadMedic Solo me refería a que PHP tiene menos trabajo que hacer - sí, definitivamente, totalmente de acuerdo. Simplemente siempre es bueno conocer alternativas (aunque a veces no sean las mejores) y tener algún tipo de puntos de referencia. Disfruta ;-)

Pieter Goosen Pieter Goosen
3 dic 2015 19:34:13
Mostrar los 1 comentarios restantes