È 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.
Sampson
@Jonathan: Non è sempre documentato, ma molte funzioni di WP accettano sia ID numerici che oggetti post completi come argomento.
Jan Fabry
Sembra che get_page_by_path() possa essere abbastanza complicato da usare quando si ha a che fare con pagine figlie...
Kaaviar
Uso 1 per le mie pagine figlie senza problemi. Davvero non vedo la complicazione in questo.
Jeremy
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à.
Toskan
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.
Adriana Hernández
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; }
User
@webcitron Penso che stia semplicemente seguendo lo schema originale di Wordpress per ottenere il post per 'title', cambiandolo semplicemente in 'slug'. (controlla il link)
Matheus Eduardo
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.
mopsyd
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