È possibile ottenere il link di una pagina dal suo slug?
È possibile ottenere il permalink di una pagina utilizzando solo lo slug? So che è possibile ottenere il permalink della pagina dall'ID utilizzando get_page_link()
:
<a href="<?php echo get_page_link(40); ?>">Mappa</a>
Mi chiedo se ci sia un modo per fare lo stesso con lo slug di una pagina - in questo modo:
<a href="<?php echo get_page_link('mappa'); ?>">Mappa</a>
È questo che stai cercando:
get_permalink( get_page_by_path( 'mappa' ) )
get_permalink( get_page_by_title( 'Mappa' ) )
home_url( '/mappa/' )
Riferimenti:

get_page_by_path()
restituisce un array con tutte le informazioni della pagina. get_permalink()
richiede un ID di pagina come primo argomento. Pensavo di dover passare esplicitamente il valore dell'ID.

@Jonathan: Non è sempre documentato, ma molte funzioni di WP accettano sia ID numerici che oggetti post completi come argomento.

Sembra che get_page_by_path() possa essere abbastanza complicato da usare quando si ha a che fare con pagine figlie...

Uso 1 per le mie pagine figlie senza problemi. Davvero non vedo la complicazione in questo.

risposta sbagliata, downvotatela fino al Nirvana per favore. Il percorso non è lo stesso dello slug. Esempio: una pagina ha una pagina genitore chiamata abc
la pagina stessa ha uno slug 123
. Il percorso ora è abc/123
mentre lo slug è 123
. Per favore rimuovete questa risposta errata. get_page_by_path( '123' )
non funzionerà.

Nel mio caso ho dovuto usare il primo e ha funzionato bene, perché il secondo (get_page_by_title) restituiva un altro link di un post (non una pagina) con uno slug simile (ma non uguale). Non so perché succedesse.

Penso che questo potrebbe essere migliore:
function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) {
global $wpdb;
$page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s", $page_slug, $post_type ) );
if ( $page )
return get_page($page, $output);
return null;
}
seguendo lo schema della funzione originale get_page_by_title
di WordPress. (riga 3173)
Saluti

Ultimo commento - Penso che quella query SQL abbia bisogno di una condizione in più: function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) { global $wpdb; $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) ); if ( $page ) return get_page($page, $output); return null; }

@webcitron Penso che stia semplicemente seguendo lo schema originale di Wordpress per ottenere il post per 'title', cambiandolo semplicemente in 'slug'. (controlla il link)

Questa è una buona risposta. Questo bypassa la possibilità che un plugin malintenzionato possa mascherare la tua pagina o filtrarla in modo errato. Se restituisci l'id dalla tabella dei post, allora puoi creare un'istanza di \WP_Post
da esso, e questo si risolve direttamente in tutte le funzioni di Wordpress che controllano altri valori. \WP_Post
fornisce anche metodi diretti per trovare la maggior parte dei dati correlati al post.

Questo è un metodo pubblicato da Tom McFarlin sul suo blog:
/**
* Restituisce il permalink per una pagina basandosi sullo slug fornito.
*
* @param string $slug Lo slug della pagina a cui vogliamo collegarci.
* @param string $post_type (opzionale) Il tipo di post personalizzato
* @return string Il permalink della pagina
* @since 1.0
*/
function wpse_4999_get_permalink_by_slug( $slug, $post_type = '' ) {
// Inizializza il valore del permalink
$permalink = null;
// Costruisce gli argomenti per WP_Query
$args = array(
'name' => $slug,
'max_num_posts' => 1
);
// Se l'argomento opzionale è impostato, lo aggiunge all'array degli argomenti
if( '' != $post_type ) {
$args = array_merge( $args, array( 'post_type' => $post_type ) );
}
// Esegue la query (e la resetta)
$query = new WP_Query( $args );
if( $query->have_posts() ) {
$query->the_post();
$permalink = get_permalink( get_the_ID() );
wp_reset_postdata();
}
return $permalink;
}
Funziona con i custom post type e con i post type nativi (come post
e page
).

la risposta accettata è sbagliata perché le pagine gerarchiche non funzionano in quel modo. In parole semplici, lo slug non è sempre il percorso della pagina o del post. Ad esempio, se la tua pagina ha una figlia, il percorso sarà slug-genitore/slug-figlio
e get_page_by_path
non riuscirà a trovare slug-figlio
in questo modo. La soluzione corretta è questa:
function mycoolprefix_post_by_slug($the_slug, $post_type = "page"){
$args = array(
'name' => $the_slug, // Slug del post/pagina
'post_type' => $post_type, // Tipo di post (default: pagina)
'post_status' => 'publish', // Solo post pubblicati
'numberposts' => 1 // Limita a 1 risultato
);
$my_page = get_posts($args)[0]; // Ottieni il primo risultato
return $my_page; // Restituisci il post/pagina
}
<a href="<?php echo mycoolprefix_post_by_slug('mappa'); ?>">Mappa</a>

Prova questo:
<a href="<?php echo get_page_link( get_page_by_path( 'map' ) ); ?>">Mappa</a>
get_page_by_path( 'percorso' )
restituisce l'oggetto pagina/post che può essere poi utilizzato da get_page_link()
poiché accetta un oggetto post/pagina e restituisce il permalink.

function theme_get_permalink_by_title( $title ) {
// Inizializza il valore del permalink
$permalink = null;
// Prova a ottenere la pagina dal titolo fornito
$page = get_page_by_title( strtolower( $title ) );
// Se la pagina esiste, otteniamo il suo permalink
if( null != $page ) {
$permalink = get_permalink( $page->ID );
} // end if
return $permalink;
} // end theme_get_permalink_by_title
Usa questa funzione con
if( null == theme_get_permalink_by_title( 'Registrati al sito' ) ) {
// Il permalink non esiste, gestisci questa situazione come meglio credi
} else {
// La pagina esiste, fai ciò che devi fare
} // end if/else
