Verifica se lo Slug della Pagina Esiste e Mostra il Titolo della Pagina
Mi sono imbattuto in questa funzione per verificare se una pagina esiste tramite il suo slug e funziona alla perfezione
function the_slug_exists($post_name) {
global $wpdb;
if($wpdb->get_row("SELECT post_name FROM wp_posts WHERE post_name = '" . $post_name . "'", 'ARRAY_A')) {
return true;
} else {
return false;
}
}
ma ora quello che devo fare è verificare se esiste e poi mostrare il titolo di quella pagina, ogni aiuto è apprezzato.
quindi quando metto questo codice sulla pagina per cercare lo slug:
<?php if (the_slug_exists('nome-pagina')) {
echo '$post_title';
} ?>
tutto è perfetto tranne il fatto che ho bisogno che la funzione mostri anche il titolo oltre a cercare lo slug, spero che così abbia più senso.

Osservando la query MySQL nella funzione diventa chiaro che, sebbene corrisponda al post_name e restituisca vero o falso, quello che vuoi trovare è se una pagina esiste tramite il suo slug. In questo caso, la funzione che hai scelto è sbagliata.
Per ottenere la pagina dal titolo puoi semplicemente usare:
$page = get_page_by_title( 'Pagina di esempio' );
echo $page->title
Nel caso in cui tu voglia ottenere la pagina dallo slug, puoi usare il seguente codice:
function get_page_title_for_slug($page_slug) {
$page = get_page_by_path( $page_slug , OBJECT );
if ( isset($page) )
return $page->post_title;
else
return "Nessuna corrispondenza trovata";
}
Puoi chiamare la funzione sopra in questo modo:
echo "<h1>" . get_page_title_for_slug("pagina-esempio") . "</h1>";
Fammi sapere se ti è stato utile.

In generale, le funzioni con prefisso the_
visualizzano direttamente l'output, mentre quelle con prefisso get_
restituiscono il valore

quindi come dovrei chiamare questa funzione in una pagina per verificare se esiste quello slug e poi visualizzare il titolo della pagina che ho appena cercato?

Grazie Pieter. Ho apportato le modifiche necessarie. @JohnCarlos - Ho aggiunto la chiamata alla funzione alla fine della mia risposta.

Ciò che questa e le altre risposte non menzionano è che la funzione get_page_by_path
fa letteralmente quello che dice. Se le passi uno slug di una pagina con un genitore non funzionerà!. In questo caso devi passargli parent_slug/slug_pagina
. Ma tutti voi date per scontato che non ci siano pagine genitore.

Quasi sempre è sconsigliato eseguire SQL personalizzato quando WordPress dispone di funzioni native per svolgere un determinato compito. Lo slug o post_name
di una pagina viene anche utilizzato nel percorso (URL) della pagina per identificare e restituire il contenuto di quella pagina quando viene visitata. Ciò significa che possiamo utilizzare get_page_by_path()
e semplicemente passare lo slug (post_name) alla funzione per ottenere l'oggetto pagina restituito.
get_page_by_path (
string $page_path,
string $output = OBJECT,
string|array $post_type = 'page'
)
Come molte altre funzioni e convenzioni di denominazione (come post_name
che in realtà è lo slug, e non il nome) in WordPress, il nome di get_page_by_path()
è confuso e IMHO stupido dato che puoi passare qualsiasi tipo di post alla funzione.
Possiamo usare get_page_by_path()
che restituirà nulla se la pagina non viene trovata, o l'oggetto pagina in caso di successo. Scriviamo una funzione wrapper corretta che restituirà false in caso di fallimento e restituirà sempre l'oggetto pagina indipendentemente dall'esistenza della pagina.
function get_post_by_post_name( $slug = '', $post_type = '' )
{
// Assicurati che siano impostati valori per $slug e $post_type
if ( !$slug
|| !$post_type
)
return false;
// Non sanitizzeremo l'input poiché get_page_by_path() gestirà ciò
$post_object = get_page_by_path( $slug, OBJECT, $post_type );
if ( !$post_object )
return false;
return $post_object;
}
Puoi quindi usarla come segue
if ( function_exists( 'get_post_by_post_name' ) ) {
$post_object = get_post_by_post_name( 'post-name-better-known-as-slug', 'your_desired_post_type' );
// Output solo se abbiamo un post valido
if ( $post_object ) {
echo apply_filters( 'the_title', $post_object->post_title );
}
}
Se hai davvero bisogno solo del titolo del post restituito, possiamo modificare leggermente la funzione.
function get_post_title_by_post_name( $slug = '', $post_type = '' )
{
// Assicurati che siano impostati valori per $slug e $post_type
if ( !$slug
|| !$post_type
)
return false;
// Non sanitizzeremo l'input poiché get_page_by_path() gestirà ciò
$post_object = get_page_by_path( $slug, OBJECT, $post_type );
if ( !$post_object )
return false;
return apply_filters( 'the_title', $post_object->post_title );
}
e poi usarla come segue
if ( function_exists( 'get_post_title_by_post_name' ) ) {
$post_title = get_post_title_by_post_name( 'post-name-better-known-as-slug', 'your_desired_post_type' );
// Output solo se abbiamo un post valido
if ( $post_title ) {
echo $post_title;
}
}

Ecco un aggiornamento dello stesso codice per te
function the_slug_exists($post_name) {
global $wpdb;
//Sanitizza il titolo
$post_name = sanitize_title($post_name);
if($wpdb->get_row("SELECT post_name FROM wp_posts WHERE post_name = '" . $post_name . "'", 'ARRAY_A')) {
return $post_name;
} else {
return false;
}
Quindi puoi eseguirla semplicemente chiamandola con la funzione echo come nel seguente codice, che stamperà solo il nome del post se esiste.
echo the_slug_exists($post_name);
AGGIORNAMENTO
In alternativa puoi utilizzare la funzione condizionale predefinita di WordPress is_page(), quindi il tuo codice diventa semplice come segue..
if( is_page($post_name) ):
echo $post_name;
endif;

In generale, le funzioni con prefisso the_
emettono in output il loro risultato mentre quelle con prefisso get_
lo restituiscono
