Come ottengo l'ID di un post (pagina o CPT) dal titolo o slug?
Ho esaminato attentamente il Codex, non sono riuscito a far funzionare get_page_by_title() e sono abbastanza sorpreso che non sembri esserci una funzione WordPress standard per questo compito.
Ho bisogno di ottenere l'ID di qualsiasi post, CPT o pagina utilizzando lo slug del post o il titolo della pagina. Idealmente, sto cercando qualcosa del genere:
get_post_ID_by_title('Il mio titolo del post', 'customposttype');
Cosa dovrei fare?

Aggiornamento: A partire da WordPress 3.0 puoi usare la funzione integrata get_page_by_title
con il terzo parametro $post_type
:
$post = get_page_by_title( 'Titolo del Post', OBJECT, 'post_type' );
$post_id = $post ? $post->ID : 0;
Risposta Originale
puoi usare questa funzione che ho trovato cercando su google "get post by title"
/**
* Recupera un post dato il suo titolo.
*
* @uses $wpdb
*
* @param string $post_title Titolo della pagina
* @param string $post_type Tipo di post ('post','page','qualunque tipo custom')
* @param string $output Opzionale. Tipo di output. 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;
}

Finora sono riuscito a evitare di utilizzare query al database, preferisco usare le funzioni standard di WP. È davvero l'unico modo per ottenere ciò che mi serve?

Il codice pubblicato è praticamente una copia diretta della get_page_by_title
funzione, la differenza principale qui è che funzionerà per tipi non gerarchici, quindi vale la pena averla nella tua raccolta di funzioni.

@t31os Non ho mai detto che fosse mio, ho solo aggiunto il parametro $post_type e sì, sta andando nella mia collezione.

Non ti stavo accusando di nulla amico, semmai sto supportando la tua risposta.. ;) Hai già il mio +1.. :)

In cosa differisce dalla funzione nativa get_page_by_title()
?.. get_page()
è praticamente un alias di get_post()
non vedo come il cambiamento influisca su qualcosa.

@Rarst Ora che me l'hai fatto notare è lo stesso, non riesco a vedere la differenza.

@t31os quindi dove entra in gioco la cosa non gerarchica che hai menzionato se la funzione è essenzialmente la stessa?..

Non so cosa stessi pensando stamattina, get_page chiama comunque get_post, e non ho idea del perché pensassi che get_page funzioni solo per tipi gerarchici, a quanto pare non credo sia vero.

Ti manca un parametro della funzione. Inserisci null come secondo parametro opzionale $output e questa funzione dovrebbe funzionare per te.
get_page_by_title('Titolo del mio articolo', null, 'customposttype');
Ho appena avuto lo stesso problema e aggiungere null lo ha risolto per me.

Di solito evito le query dirette al database. Preferisco invece utilizzare l'oggetto WP_Query
che si occupa di elaborare i dati per me.
Questa è sostanzialmente una funzione che utilizzo in uno dei miei temi per ottenere un post in base a uno slug specifico:
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();
}
Questo codice crea una query utilizzando l'API di WordPress per recuperare un post di un tipo specifico con un determinato slug, esegue le normali funzioni del loop sul risultato e restituisce l'ID del post. Potresti anche modificare la funzione per far sì che restituisca l'intero post, ma dipende dalle tue esigenze.

Questo metodo ha qualche anno, ma compare ancora quando si cerca su Google. Ecco un modo semplice per farlo:
$page = get_page_by_title( 'il mio titolo del post' );
oppure
$page = get_post_ID_by_title('il mio titolo del post', OBJECT, 'customposttype');
Poi basta usare l'oggetto $page per ottenere l'ID:
$page->ID

Attualmente (WP >4.9.2) puoi trovare qualsiasi post/pagina ecc. per titolo/slug in questo modo:
$page = get_posts(
array(
//'name' => 'il-tuo-post-slug', // per slug del post
'title' => 'Il tuo titolo del post', // per titolo del post
'post_type' => 'page' // tipo di post a tua scelta
)
);
if ($page = $page[0]) // Viene preso il primo ID/il più basso se ci sono più oggetti
{
// Poi fai ciò che ti serve...
// $id = $page->id;
// $content = $page->post_content;
// oppure $content = apply_filters('the_content', $page->post_content);
// ecc.
}
