¿Cómo obtengo el ID de una entrada (página o CPT) desde un título o slug?
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?

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

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?

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 Nunca dije que fuera mía, solo le agregué el parámetro $post_type y sí, definitivamente va a mi colección.

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

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

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

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.

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

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.

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

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