Come recuperare la lumaca della pagina corrente?


99

Sto cercando di recuperare la lumaca dell'attuale pagina di WordPress al di fuori del ciclo. Il titolo della pagina ritorna con wp_title (), ma come posso ottenere la lumaca?

<li>
  <a href="/slug-of-current-page/">
    <?php wp_title('', true); ?>
  </a>
</li>

Risposte:


151

Usa la variabile globale $post:

<?php 
    global $post;
    $post_slug = $post->post_name;
?>

3
Grazie. La tua soluzione funziona alla grande. Devo solo fare eco alla lumaca:<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
sarytash,

1
Come ha detto sarytash, è necessario echo. Quindi, sarebbe l'ideale:<?php global $post; echo $post->post_name; ?>
its_me,


68

Come per altre risposte, la lumaca è memorizzata nella post_nameproprietà. Anche se è possibile accedervi direttamente, preferisco la funzione (sottoutilizzata) get_post_field()per accedere alle proprietà dei post che non hanno un'API adeguata per loro.

Richiede post fornito esplicitamente e non è predefinito a quello corrente, quindi per intero per il post corrente sarebbe:

$slug = get_post_field( 'post_name', get_post() );

12
Vale la pena notare che se sei nel ciclo puoi usare get_post_fieldsenza secondo argomento ( docs )
jmarceli,

26

MODIFICA 5 APRILE 2016

Dopo aver scavato per maggiore affidabilità, ho finito per fare questa risposta al seguente post che porta a questa modifica: ( Assicurati di controllare )

Il metodo più affidabile fino alla data che ho potuto trovare è il seguente:

// Get the queried object and sanitize it
$current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() );
// Get the page slug
$slug = $current_page->post_name;

In questo modo, sei sicuro al 99,9999% di ottenere sempre i dati corretti.

RISPOSTA ORIGINALE

Un'altra alternativa più sicura a questo problema è l'utilizzo get_queried_object()che contiene l'oggetto interrogato corrente per ottenere lo slug di pagina che è trattenuto dalla post_nameproprietà. Questo può essere utilizzato ovunque nel modello.

$postpuò essere utilizzato, ma può essere inaffidabile in quanto qualsiasi query personalizzata o codice personalizzato può modificare il valore di $post, quindi dovrebbe essere evitato al di fuori del ciclo.

L'uso 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 usando il male query_postsche rompe l'oggetto di query principale, ma dipende da te.

È possibile utilizzare quanto sopra come segue

if ( is_page() )
    $slug = get_queried_object()->post_name;

Devo dire che query_postsnon è male quando si desidera modificare la query principale , che tuttavia di solito non lo fa e viene spesso utilizzata in modo improprio :)
jave.web

11

Il modo semplice per ottenere la lumaca è con:

<?php echo basename(get_permalink()); ?>

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

8

Dato l'esempio di codice, sembra che ciò di cui hai veramente bisogno sia un link. In tal caso, è possibile utilizzare get_permalink () , che può essere utilizzato al di fuori del ciclo. Ciò dovrebbe fare ciò di cui hai bisogno in modo più affidabile rispetto all'utilizzo del post slug.


4
Questo è l'URL completo, non solo la lumaca.
Fred,

2

Potrebbe essere una vecchia domanda, ma ho creato le funzioni get_the_slug () e the_slug () in base alle tue risposte.

if ( !function_exists("get_the_slug") ) {
    /**
    * Returns the page or post slug.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    * @return string
    */
    function get_the_slug( $id = null ){
        $post = get_post($id);
        if( !empty($post) ) return $post->post_name;
        return ''; // No global $post var or matching ID available.
    }
    /**
    * Display the page or post slug
    *
    * Uses get_the_slug() and applies 'the_slug' filter.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    */
    function the_slug( $id=null ){
        echo apply_filters( 'the_slug', get_the_slug($id) );
    }
}


0

Poco più avanti sulla risposta di @Matthew Boynes, se sei interessato a ottenere la lumaca genitore (se presente), allora 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 le lumache alla classe corporea:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );

0

Se si desidera una risposta più dettagliata, è possibile utilizzare la seguente query SQL per recuperare tutti i post che sono post, pagine o tassonomie personalizzate in qualsiasi momento, anche se non sono stati ancora attivati ​​hook.

SQL non elaborato:


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`;

Funziona anche sulla prima riga del file delle funzioni, anche prima dei hook mu_plugins_loadedo init.

@Nota

Ciò presuppone che tu abbia un prefisso di database standard wp_posts. Se devi tenere conto dei prefissi variabili, puoi ottenere abbastanza facilmente la corretta tabella postale tramite PHP procedendo come 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`;"

Quindi eseguire sia con $wpdb, mysqlio un PDOesempio. Poiché non vi è alcun input dell'utente in questa query, è sicuro eseguirlo senza un'istruzione preparata purché non si inietti alcuna variabile in essa.

Suggerirei di memorizzarlo come valore statico privato di una classe, in modo che sia possibile accedervi 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()
    {
        //This way it skips the operation if it's already set.
        $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 ) )
        {
            //returns the specific column value for the id
            return self::$post_cache[$id][$type];
        }
        //returns the whole row
        return self::$post_cache[$id];
    }

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

            $query = "...";
            $result = some_query_method($query); //Do your query logic here.
            self::$post_cache = $result;
        {
    }
}

uso

$cache = new \Post_Cache();

//Get the page slug
$slug = $cache->get( get_the_ID(), 'slug');

if ($cache->get( get_the_ID() ))
{
    //post exists
} else {
    //nope, 404 'em
}
if ( $cache->get( get_the_ID(), 'status') === 'publish' )
{
    //it's public
} else {
    //either check current_user_can('whatever_permission') or just 404 it,
    //depending whether you want it visible to the current user or not.
}
if ( $cache->get( get_the_ID(), 'type') === 'post' )
{
    //It's a post
}
if ( $cache->get( get_the_ID(), 'type') === 'page' )
{
    //It's a page
}

Hai capito. Se hai bisogno di ulteriori dettagli, puoi recuperarli come al solito connew \WP_Post( get_the_ID() );


Ciò ti consentirà di controllare i post in qualsiasi momento, anche se il ciclo di wordpress non ha raggiunto un punto in cui trova piacevole la tua richiesta. Questa è una versione leggermente più ottimizzata della stessa query eseguita dal core di Wordpress stesso. Questo filtro esclude tutta la posta indesiderata che non vorresti restituire e ti dà solo un elenco ben organizzato con ID autore, tipo di post, slug e visibilità pertinenti. Se hai bisogno di ulteriori dettagli, puoi recuperarli come di consueto new \WP_Post($id);o utilizzare qualsiasi altra funzione nativa di Wordpress con una delle righe della tabella pertinenti, anche al di fuori del ciclo.

Uso un setup simile in un paio di miei temi e plugin personalizzati, e funziona abbastanza bene. È anche sicuro e non lascia i dati interni fluttuanti nell'ambito globale dove possono essere sovrascritti come la maggior parte delle cose in Wordpress.


0

Onestamente non capisco perché nessuna delle risposte semplicemente:

global $wp;
$current_slug = $wp->request;

// Given the URL of https://example.com/foo-bar
if ($current_slug === 'foo-bar') {
  // the condition will match.
}

Funziona con tutti i post, le pagine, i percorsi personalizzati.


-1

Pagina dinamica che chiama in WordPress.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.