Come ottengo l'ID di un post (pagina o CPT) dal titolo o slug?

6 mar 2011, 12:35:38
Visualizzazioni: 26.5K
Voti: 7

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?

3
Commenti

Come stavi utilizzando get_page_by_title e il custom post type è gerarchico? Non credo che get_page (chiamato da get_page_by_title) funzioni per tipi non gerarchici.

t31os t31os
6 mar 2011 13:00:16

Sì, il custom post type in questione è non gerarchico.

jnthnclrk jnthnclrk
6 mar 2011 13:15:03

Ignora il commento precedente riguardo all'essere gerarchico, non dovrebbe avere importanza, come stavi chiamando get_page_by_title?

t31os t31os
7 mar 2011 01:27:38
Tutte le risposte alla domanda 5
10
13

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;
}
6 mar 2011 13:01:14
Commenti

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?

jnthnclrk jnthnclrk
6 mar 2011 13:14:07

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 t31os
6 mar 2011 13:25:20

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

Bainternet Bainternet
6 mar 2011 13:45:12

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

t31os t31os
6 mar 2011 14:13:06

@t31os Lo so, era solo una brutta battuta :)

Bainternet Bainternet
6 mar 2011 14:29:06

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 Rarst
6 mar 2011 21:50:17

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

Bainternet Bainternet
6 mar 2011 21:57:58

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

Rarst Rarst
6 mar 2011 22:09:09

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.

t31os t31os
7 mar 2011 01:26:35

Questo può essere fatto facilmente con l'oggetto pagina. Vedi la mia risposta qui sotto.

Phill Healey Phill Healey
30 lug 2017 02:03:37
Mostra i restanti 5 commenti
1

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.

17 giu 2011 20:30:33
Commenti

Quel null dovrebbe essere OBJECT per chiarezza. Ma sì, stava sostanzialmente inserendo il post type come tipo di output omettendo il tipo di output.

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

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.

17 giu 2011 20:44:52
Commenti

Invece di $query->the_post() che altera il loop e potrebbe interrompere qualsiasi funzione get_the_xxx dopo di essa, è preferibile usare:

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

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
30 lug 2017 02:02:45
0

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.
}
3 feb 2018 23:59:07