È possibile ottenere il link di una pagina dal suo slug?

7 dic 2010, 19:09:07
Visualizzazioni: 219K
Voti: 150

È 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>
2
Commenti

Puoi anche usare: site_url('page-slug')

user123456789 user123456789
13 gen 2021 09:19:51

Nota che molte delle risposte confondono lo slug di un post (la colonna post_name nella tabella wp_posts del database) con il titolo di un post, che sono cose diverse. È anche diverso dal percorso di un post (soprattutto evidente quando si usano percorsi gerarchici o quando due post di tipi diversi condividono lo stesso slug).

Flimm Flimm
14 lug 2022 14:41:11
Tutte le risposte alla domanda 7
11
238

È questo che stai cercando:

  • get_permalink( get_page_by_path( 'mappa' ) )
  • get_permalink( get_page_by_title( 'Mappa' ) )
  • home_url( '/mappa/' )

Riferimenti:

7 dic 2010 20:19:31
Commenti

Intendevi get_permalink(get_page_by_path('contact')->ID));?

Sampson Sampson
8 dic 2010 00:22:09

Hmm no? Cosa c'entra l'ID?

zeo zeo
8 dic 2010 03:52:10

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 Sampson
8 dic 2010 06:47:54

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

Jan Fabry Jan Fabry
8 dic 2010 09:18:05

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

Kaaviar Kaaviar
14 nov 2011 16:57:15

Concordo con Kaaviar, la funzione qui sotto è migliore.

Rezen Rezen
10 ago 2012 22:13:06

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

Jeremy Jeremy
19 dic 2014 21:08:44

home_url( '/map/' ) ha funzionato per me

Shady Mohamed Sherif Shady Mohamed Sherif
15 apr 2017 07:18:09

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 Toskan
2 set 2017 01:03:12

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 Adriana Hernández
10 giu 2019 21:42:59

@Toskan Per l'esempio che hai fornito, l'URL corretto sarebbe restituito da get_permalink( get_page_by_path( 'abc/123' ) ).

Boycott A.I. Boycott A.I.
11 lug 2023 21:17:12
Mostra i restanti 6 commenti
5
11

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

28 feb 2011 17:21:55
Commenti

Perché sarebbe meglio? Puoi spiegare?

julien_c julien_c
11 apr 2012 16:11:18

Perché? Non genera un oggetto post completo solo per ottenere l'ID.

s_ha_dum s_ha_dum
9 gen 2013 16:53:10

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 User
9 gen 2013 16:27:23

@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 Matheus Eduardo
13 mag 2013 14:08:55

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 mopsyd
23 mar 2018 05:53:05
1

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).

31 gen 2013 23:19:43
Commenti

In Wordpress 6.4.2, ho dovuto utilizzare post_name invece di name nella query $args

Scribblemacher Scribblemacher
12 gen 2024 19:56:06
0

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>
2 set 2017 01:10:53
2

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.

26 feb 2018 13:54:08
Commenti

Per favore [modifica] la tua risposta e aggiungi una spiegazione: perché questa soluzione potrebbe risolvere il problema?

fuxia fuxia
26 feb 2018 15:27:02

Nota che il percorso non è necessariamente lo stesso dello slug.

Flimm Flimm
14 lug 2022 14:39:04
1
-1
    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
11 nov 2014 06:49:51
Commenti

Il titolo non corrisponde allo slug.

Flimm Flimm
14 lug 2022 14:39:50
1
-1

Un po' in ritardo, ma gentile...

Puoi fare così:
<?php $map = get_page_by_title( 'mappa' ); ?>
<a href="<?php echo get_page_link('$map->ID'); ?>">Mappa</a>

È così che lo faccio io :-)

Grazie,
Josh

1 gen 2021 16:59:52
Commenti

Il titolo non corrisponde allo slug.

Flimm Flimm
14 lug 2022 14:39:35