Come posso recuperare lo slug della pagina corrente?

13 feb 2012, 06:25:46
Visualizzazioni: 569K
Voti: 140

Sto cercando di recuperare lo slug della pagina WordPress corrente fuori dal loop. Il titolo della pagina viene restituito con wp_title(), ma come posso ottenere lo slug?

<li>
  <a href="/slug-della-pagina-corrente/">
    <?php wp_title('', true); ?>
  </a>
</li>
0
Tutte le risposte alla domanda 12
6
223

Usa la variabile globale $post:

<?php 
    // Dichiariamo la variabile globale $post
    global $post;
    // Otteniamo lo slug del post
    $post_slug = $post->post_name;
?>
13 feb 2012 08:27:21
Commenti

Grazie. La tua soluzione funziona alla grande. Devi solo fare l'echo dello slug: <?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>

sarytash sarytash
13 feb 2012 14:13:52

Come ha detto sarytash, devi usare echo. Quindi, questo sarebbe l'ideale: <?php global $post; echo $post->post_name; ?>

its_me its_me
11 ott 2013 18:59:35

Che ne dici di $WP_Post?

Peter Mortensen Peter Mortensen
24 apr 2019 16:00:07

Non funzionerà se ti trovi, ad esempio, su yourpage.com/search se questa non è una pagina esistente ma un rewrite da ?s=

trainoasis trainoasis
14 ott 2020 15:55:19

post_name non è il titolo leggibile dall'utente (inclusi gli spazi vuoti) invece dello slug?

abinmorth abinmorth
7 lug 2021 20:01:57

@abinmorth no, quello è post_title.

Gavin Gavin
13 set 2022 17:56:18
Mostra i restanti 1 commenti
6
113

Come indicato in altre risposte, lo slug è memorizzato nella proprietà post_name. Anche se potrebbe essere accessibile direttamente, preferisco utilizzare la funzione (poco utilizzata) get_post_field() per accedere alle proprietà dei post che non hanno una propria API dedicata.

Richiede che il post sia fornito esplicitamente e non utilizza quello corrente come predefinito, quindi per il post corrente il codice completo sarebbe:

$slug = get_post_field( 'post_name', get_post() );
21 mag 2015 00:10:06
Commenti

Vale la pena notare che se sei nel loop puoi utilizzare get_post_field senza il secondo argomento (documentazione)

jmarceli jmarceli
16 giu 2016 09:42:13

Piccola nota: Ho utilizzato questo metodo in circa 8 diversi siti web con il mio plugin, ma non è riuscito a recuperare lo slug della pagina corretto nell'ultimo sito web in cui ho installato il plugin. I temi o altri plugin probabilmente hanno compromesso il corretto riferimento all'oggetto $post, risultando nello slug del post sbagliato. Ad ogni modo, la risposta di @Pieter Goosen ha risolto questo problema per me: https://wordpress.stackexchange.com/a/188945/150100

Vasco Vasco
19 ott 2020 13:07:39

Questa dovrebbe essere accettata come risposta

Lovor Lovor
17 feb 2021 15:13:03

È probabilmente ovvio, ma voglio anche aggiungere che il secondo argomento può essere anche un ID del post.

Gavin Gavin
20 giu 2021 08:57:04

sì questo o la risposta di Pieter qui sotto dovrebbe essere la risposta accettata! perché? ... se globalizzi $post in una funzione e poi inavvertitamente gli assegni un valore... hai appena sovrascritto il $post globale che potrebbe causare problemi nel codice successivo... è meglio usare questo esempio o get_queried_object()->post_name

aequalsb aequalsb
29 lug 2021 21:15:39

Questo non funziona in alcuni casi. Per esempio, ho creato una pagina blog. Per questa pagina, $slug ha restituito il permalink del primo post del blog invece di 'blog' che era quello che mi aspettavo. Anche io suggerisco di usare get_queried_object()->post_name.

Andrew Andrew
29 set 2022 05:11:08
Mostra i restanti 1 commenti
1
40

EDIT 5 APRILE 2016

Dopo aver cercato una soluzione più affidabile, sono arrivato a questa risposta al seguente post che porta a questa modifica: (Assicurati di controllarlo)

Il metodo più affidabile fino ad oggi che sono riuscito a trovare è il seguente:

// Ottieni l'oggetto interrogato e sanitizzalo
$current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() );
// Ottieni lo slug della pagina
$slug = $current_page->post_name;

In questo modo, sei sicuro al 99.9999% di ottenere i dati corretti ogni volta.

RISPOSTA ORIGINALE

Un'altra alternativa più sicura a questo problema è l'utilizzo di get_queried_object() che contiene l'oggetto attualmente interrogato per ottenere lo slug della pagina che è contenuto nella proprietà post_name. Questo può essere utilizzato ovunque nel tuo template.

$post può essere utilizzato, ma può essere inaffidabile poiché qualsiasi query personalizzata o codice personalizzato può modificare il valore di $post, quindi dovrebbe essere evitato al di fuori del loop.

L'utilizzo di get_queried_object() per ottenere l'oggetto della pagina corrente è molto più affidabile ed è meno probabile che venga modificato, a meno che non si stia utilizzando il malvagio query_posts che interrompe l'oggetto della query principale, ma questo dipende tutto da te.

Puoi utilizzare quanto sopra come segue

if ( is_page() )
    $slug = get_queried_object()->post_name;
21 mag 2015 10:00:26
Commenti

Devo dire che query_posts non è malvagio quando si vuole modificare la query principale, cosa che però solitamente non si vuole fare e viene spesso utilizzata in modo improprio :)

jave.web jave.web
3 mar 2018 23:12:37
4
26

Il modo semplice per ottenere lo slug è con:

<?php echo basename(get_permalink()); ?>
25 set 2015 02:26:22
Commenti

questo dipende dalle impostazioni dei permalink. Se usi l'impostazione "semplice", i link appariranno come http://domain/?p=123, lasciandoti con ?p=123.

Mene Mene
14 ott 2016 13:36:28

@Mene vero, ma la domanda è come ottenere lo slug che, solitamente, significa che ce n'è uno nell'url (il parametro GET p non è uno slug).

jave.web jave.web
17 feb 2020 13:43:59

Questa è una soluzione così elegante in una riga :D

Sean Doherty Sean Doherty
13 mar 2020 17:46:13

Bello, molto bello :)

Chaoley Chaoley
21 ott 2020 06:46:47
1

Dato l'esempio di codice, sembra che ciò di cui hai realmente bisogno sia un link. In questo caso, puoi utilizzare get_permalink(), che può essere utilizzato anche al di fuori del loop. Questo dovrebbe fare ciò di cui hai bisogno in modo più affidabile rispetto all'utilizzo dello slug del post.

13 feb 2012 06:55:40
Commenti

Questo è l'URL completo, non solo lo slug.

Fred Fred
21 nov 2014 17:09:20
0

Potrebbe essere una domanda vecchia, ma ho creato le funzioni get_the_slug() e the_slug() basate sulle vostre risposte.

if ( !function_exists("get_the_slug") ) {
    /**
    * Restituisce lo slug della pagina o dell'articolo.
    *
    * @param int|WP_Post|null $id (Opzionale) ID del post o oggetto post. Predefinito alla variabile globale $post.
    * @return string
    */
    function get_the_slug( $id = null ){
        $post = get_post($id);
        if( !empty($post) ) return $post->post_name;
        return ''; // Nessuna variabile globale $post o ID corrispondente disponibile.
    }
    /**
    * Visualizza lo slug della pagina o dell'articolo
    *
    * Utilizza get_the_slug() e applica il filtro 'the_slug'.
    *
    * @param int|WP_Post|null $id (Opzionale) ID del post o oggetto post. Predefinito alla variabile globale $post.
    */
    function the_slug( $id=null ){
        echo apply_filters( 'the_slug', get_the_slug($id) );
    }
}
29 ago 2017 12:09:01
1

Puoi semplicemente dividere lo slug dalla richiesta utilizzando explode.

global $wp;
// Poiché gli slug non possono contenere slash,
// dividiamo la stringa sugli slash e prendiamo solo l'ultima parte.
$request_args = explode('/', $wp->request);
$current_slug = end($request_args);

// Data l'URL https://example.com/foo/bar/foo-bar
if ($current_slug === 'foo-bar') {
  // la condizione corrisponderà.
}

Questo funziona per tutti i post, le pagine e le route personalizzate.

9 apr 2019 11:56:12
Commenti

Questa è la migliore risposta a questa domanda - nulla ha funzionato finché non ho provato questo.

Chris Chris
15 ago 2020 00:20:31
1

Questa è la funzione da utilizzare quando si desidera recuperare lo slug al di fuori del loop.

get_post_field( 'post_name');

Risposta trovata qui: Come recuperare lo Slug della pagina corrente in WordPress?

24 nov 2018 18:03:12
Commenti

Esatto, ma devi passare $post o l'ID del post come secondo argomento.

trainoasis trainoasis
17 ott 2019 14:29:42
0

Se desideri una risposta più approfondita, puoi utilizzare la seguente query SQL per recuperare tutti i post che sono post, pagine o tassonomie personalizzate in qualsiasi momento, anche se nessun hook è stato ancora eseguito.

SQL puro:


SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS 
`slug`, `post_status` AS `status`
FROM wp_posts 
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;

Questo funziona anche alla prima riga del tuo file functions, anche prima degli hook mu_plugins_loaded o init.

@nota

Questo presuppone che tu abbia un prefisso database standard wp_posts. Se devi gestire prefissi variabili, puoi ottenere facilmente la tabella dei post corretta attraverso PHP facendo quanto segue:

<?php
global $wpdb;
$table = $wpdb->posts;
$query = "SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS 
`slug`, `post_status` AS `status`
FROM " . $table . "
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;"

Poi esegui con $wpdb, mysqli, o un'istanza PDO. Poiché non c'è input utente in questa query, è sicuro eseguirla senza una prepared statement finché non inserisci variabili al suo interno.

Suggerirei di memorizzare questo come valore statico privato di una classe, in modo che possa essere accessibile senza dover eseguire nuovamente la query più di una volta per pagina per ottenere le migliori prestazioni, qualcosa del genere:

class Post_Cache
{
    private static $post_cache;

    public function __construct()
    {
        //In questo modo salta l'operazione se è già impostata
        $this->initCache();
    }

    public function get($id, $type = null)
    {
        if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) )
            return false;
        }
        if ( !is_null( $type ) )
        {
            //restituisce il valore della colonna specifica per l'id
            return self::$post_cache[$id][$type];
        }
        //restituisce l'intera riga
        return self::$post_cache[$id];
    }

    private function initCache()
    {
        if ( is_null(self::$post_cache) )
        {

            $query = "...";
            $result = some_query_method($query); //Inserisci qui la tua logica di query
            self::$post_cache = $result;
        {
    }
}

Utilizzo

$cache = new \Post_Cache();

//Ottieni lo slug della pagina
$slug = $cache->get( get_the_ID(), 'slug');

if ($cache->get( get_the_ID() ))
{
    //il post esiste
} else {
    //no, errore 404
}
if ( $cache->get( get_the_ID(), 'status') === 'publish' )
{
    //è pubblico
} else {
    //verifica current_user_can('whatever_permission') o restituisci 404,
    //a seconda se vuoi che sia visibile all'utente corrente o no
}
if ( $cache->get( get_the_ID(), 'type') === 'post' )
{
    //È un post
}
if ( $cache->get( get_the_ID(), 'type') === 'page' )
{
    //È una pagina
}

Hai capito l'idea. Se hai bisogno di ulteriori dettagli, puoi recuperarli normalmente con new \WP_Post( get_the_ID() );


Questo ti permetterà di controllare i post in qualsiasi momento, anche se il loop di WordPress non ha ancora raggiunto un punto in cui trova la tua richiesta accettabile. Questa è una versione leggermente più ottimizzata della stessa query eseguita dal core di WordPress. Questa filtra tutto il contenuto inutile che non vorresti fosse restituito e ti fornisce un elenco ben organizzato con l'ID dell'autore, il tipo di post, lo slug e la visibilità. Se hai bisogno di ulteriori dettagli, puoi recuperarli normalmente con new \WP_Post($id);, o utilizzare qualsiasi altra funzione nativa di WordPress con qualsiasi riga della tabella pertinente, anche al di fuori del loop.

Utilizzo una configurazione simile in alcuni dei miei temi e plugin personalizzati e funziona molto bene. È anche sicuro e non lascia dati interni fluttuanti nello scope globale dove possono essere sovrascritti come fa la maggior parte delle cose in WordPress.

23 mar 2018 03:43:49
0

Se ti trovi all'interno del loop allora le altre risposte ti saranno d'aiuto. In caso contrario (per esempio se stai agganciando su init o plugins_loaded) puoi ricorrere a una funzione PHP nativa come parse_url().

Ecco una funzione che funziona in entrambi i casi:

function get_the_slug() {
    global $post;
    $slug = $post->post_name ?? '';

    if ( ! $slug ) {
        $slug = basename( parse_url( $_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH ) );
    }

    return $slug;
}

Nota bene che questo approccio funziona solo su articoli/pagine al primo livello, a causa di come funziona basename().

10 nov 2021 12:53:48
0

A integrazione della risposta di @Matthew Boynes, se sei interessato a ottenere anche lo slug del genitore (se presente), ho trovato utile questa funzione:

function mytheme_get_slugs() {
    if ( $link = get_permalink() ) {
        $link = str_replace( home_url( '/' ), '', $link );
        if ( ( $len = strlen( $link ) ) > 0 && $link[$len - 1] == '/' ) {
            $link = substr( $link, 0, -1 );
        }
        return explode( '/', $link );
    }
    return false;
}

Ad esempio, per aggiungere gli slug alla classe del body:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );
12 feb 2015 18:33:31
0
-1

Richiamo di pagine dinamiche in WordPress.

<?php
    // Ottiene una parte del template dalla cartella specificata usando il nome della pagina corrente
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
14 feb 2017 06:05:44