¿Cómo obtengo el ID de una entrada (página o CPT) desde un título o slug?

6 mar 2011, 12:35:38
Vistas: 26.5K
Votos: 7

He revisado exhaustivamente el Codex, no logré hacer funcionar get_page_by_title() y me sorprende que no parezca haber una función estándar de WordPress para esta tarea.

Necesito obtener el ID de cualquier entrada, CPT o página usando el slug o el título de la entrada/página. Idealmente, estoy buscando algo como esto:

get_post_ID_by_title('Mi título de entrada', 'customposttype');

¿Qué debería estar haciendo?

3
Comentarios

¿Cómo estabas usando get_page_by_title y es el tipo de entrada personalizado jerárquico? No creo que get_page (llamado por get_page_by_title) funcione para tipos no jerárquicos.

t31os t31os
6 mar 2011 13:00:16

Sí, el tipo de entrada personalizado en cuestión no es jerárquico.

jnthnclrk jnthnclrk
6 mar 2011 13:15:03

Ignora el comentario anterior sobre ser jerárquico, eso no debería importar, ¿cómo estabas llamando a get_page_by_title?

t31os t31os
7 mar 2011 01:27:38
Todas las respuestas a la pregunta 5
10
13

Actualización: A partir de WordPress 3.0 puedes usar la función integrada get_page_by_title con el tercer parámetro $post_type:

$post = get_page_by_title( 'Título del Post', OBJECT, 'post_type' );

$post_id = $post ? $post->ID : 0;

Respuesta Original

puedes usar esta función que aparece en google al buscar "get post by title"

/**
* Obtiene un post a partir de su título.
*
* @uses $wpdb
*
* @param string $post_title Título de la página
* @param string $post_type Tipo de post ('post','page','any custom type')
* @param string $output Opcional. Tipo de salida. OBJECT, ARRAY_N, o ARRAY_A.
* @return mixed
*/
function get_post_by_title($page_title, $post_type ='post' , $output = OBJECT) {
    global $wpdb;
        $post = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type= %s", $page_title, $post_type));
        if ( $post )
            return get_post($post, $output);
 
    return null;
}
6 mar 2011 13:01:14
Comentarios

Hasta ahora he logrado evitar usar consultas a la base de datos, ya que prefiero usar las funciones estándar de WP. ¿Es esta realmente la única manera de lograr lo que necesito?

jnthnclrk jnthnclrk
6 mar 2011 13:14:07

El código publicado es prácticamente una copia directa de la get_page_by_title función, la principal diferencia aquí es que funcionará para tipos no jerárquicos, por lo que vale la pena tenerla en tu colección de funciones.

t31os t31os
6 mar 2011 13:25:20

@t31os Nunca dije que fuera mía, solo le agregué el parámetro $post_type y sí, definitivamente va a mi colección.

Bainternet Bainternet
6 mar 2011 13:45:12

No te estaba acusando de nada, amigo, más bien estoy apoyando tu respuesta.. ;) Ya tienes mi +1.. :)

t31os t31os
6 mar 2011 14:13:06

@t31os Lo sé, solo era un mal chiste :)

Bainternet Bainternet
6 mar 2011 14:29:06

¿En qué se diferencia esto de la función nativa get_page_by_title()?.. get_page() es básicamente un alias de get_post(), no veo cómo el cambio afecta algo.

Rarst Rarst
6 mar 2011 21:50:17

@Rarst Ahora que lo mencionas, es lo mismo, no veo la diferencia.

Bainternet Bainternet
6 mar 2011 21:57:58

@t31os entonces ¿dónde entra en juego lo no jerárquico que mencionaste si la función es esencialmente la misma?..

Rarst Rarst
6 mar 2011 22:09:09

No sé en qué estaba pensando esta mañana, get_page llama a get_post de todos modos, y no tengo idea de por qué pensé que get_page solo funciona para tipos jerárquicos, creo que eso no es cierto como resulta.

t31os t31os
7 mar 2011 01:26:35

Esto se puede hacer fácilmente con el objeto de página. Consulta mi respuesta a continuación.

Phill Healey Phill Healey
30 jul 2017 02:03:37
Mostrar los 5 comentarios restantes
1

Te falta un parámetro en la función. Pasa un null como segundo parámetro opcional $output y esta función debería funcionar para ti.

get_page_by_title('Mi título de publicación', null, 'customposttype');

Acabo de encontrarme con el mismo problema y agregar el null lo solucionó para mí.

17 jun 2011 20:30:33
Comentarios

Ese null debería ser realmente OBJECT para mayor claridad. Pero sí, básicamente estaba pasando el tipo de publicación como tipo de salida al omitir el tipo de salida.

Phill Healey Phill Healey
30 jul 2017 02:05:21
1

Suelo evitar las consultas directas a la base de datos. En su lugar, utilizo el objeto WP_Query para que haga el trabajo por mí.

Básicamente, esta es una función que uso en uno de mis temas para obtener una entrada basada en un slug dado:

function get_post_id( $slug, $post_type ) {
    $query = new WP_Query(
        array(
            'name' => $slug,
            'post_type' => $post_type
        )
    );

    $query->the_post();

    return get_the_ID();
}

Esto creará una consulta utilizando la API de WP para obtener una entrada de un tipo específico con un slug dado, ejecutará las funciones habituales del bucle en el resultado y devolverá el ID de la entrada. También podrías modificarla para devolver la entrada completa, pero eso ya depende de ti.

17 jun 2011 20:44:52
Comentarios

En lugar de $query->the_post() que altera el bucle y puede interrumpir cualquier función get_the_xxx después de él, es mejor usar:

if ($query->have_posts())
 {
  return $query->posts[0]->ID;
 }
 else
 {
  return 0;
 }
Mikepote Mikepote
14 dic 2015 15:07:11
0

Esto tiene algunos años, pero todavía aparece cuando se busca en Google. Así que aquí hay una forma sencilla de hacerlo:

$page = get_page_by_title( 'mi título de publicación' );

o

$page = get_post_ID_by_title('mi título de publicación', OBJECT, 'customposttype');

Luego simplemente usa el objeto $page para obtener el ID:

$page->ID
30 jul 2017 02:02:45
0

Actualmente (WP >4.9.2) podrás encontrar cualquier entrada/página, etc. por título/slug de esta manera:

$page = get_posts(
    array(
        //'name'      => 'tu-slug-de-entrada', // por slug de entrada
        'title'      => 'El título de tu entrada', // por título de entrada
        'post_type' => 'page' // tipo de entrada de tu preferencia
    )
);

if ($page = $page[0]) // Se toma el primer ID/más bajo si hay muchos objetos
{
    // Luego haces lo que sea necesario...
    // $id = $page->id;
    // $content = $page->post_content;
    // o $content = apply_filters('the_content', $page->post_content);
    // etc.
}
3 feb 2018 23:59:07