Comment récupérer le slug de la page actuelle?

80

J'essaie de récupérer le slug de la page wordpress actuelle en dehors de la boucle. Le titre de la page revient avec wp_title () mais comment puis-je obtenir le slug?

<li><a href="/slug-of-current-page/"><?php wp_title("",true); ?></a></li>
    
posée sarytash 13.02.2012 - 05:25
la source

10 réponses

133

utilisez la variable globale $post .

<?php 
    global $post;
    $post_slug=$post->post_name;
?>
    
réponse donnée Arvind Pal 13.02.2012 - 07:27
la source
61

Comme d’autres réponses, le slug est stocké dans la propriété post_name . Bien qu’il puisse être accessible directement, je préfère la fonction (sous-utilisée) get_post_field() pour les propriétés de publication d’accès qui n’ont pas d’API appropriée.

Il faut que le message soit fourni explicitement et ne correspond pas au message actuel. Par conséquent, le message complet serait:

$slug = get_post_field( 'post_name', get_post() );
    
réponse donnée Rarst 20.05.2015 - 23:10
la source
25

EDIT 5 AVRIL 2016

Après avoir cherché plus de fiabilité, j'ai finalement fait cette réponse au message suivant qui mène à cette modification. : ( Assurez-vous de vérifier cela )

La méthode la plus fiable à ce jour que je pourrais trouver est la suivante:

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

De cette façon, vous êtes sûr à 99,9999% d’obtenir les bonnes données à chaque fois.

RÉPONSE ORIGINALE

Une autre alternative plus sûre à ce problème consiste à utiliser get_queried_object() qui contient l’objet interrogé actuel pour obtenir le slug de page détenu par la propriété post_name . Ceci peut être utilisé n'importe où dans votre modèle.

$post peut être utilisé, mais cela peut ne pas être fiable, car toute requête personnalisée ou code personnalisé peut modifier la valeur de $post ; elle doit donc être évitée en dehors de la boucle.

L'utilisation de get_queried_object() pour obtenir l'objet de la page en cours est beaucoup plus fiable et moins susceptible d'être modifiée, à moins que vous n'utilisiez le mal query_posts qui casse l'objet de requête principal, mais tout dépend de vous.

Vous pouvez utiliser ce qui précède comme suit

if ( is_page() )
    $slug = get_queried_object()->post_name;
    
réponse donnée Pieter Goosen 21.05.2015 - 09:00
la source
9

Le moyen le plus simple d’obtenir la limace est de:

<?php echo basename(get_permalink()); ?>
    
réponse donnée tracey 25.09.2015 - 01:26
la source
7

Étant donné l'exemple de code, il semble que vous ayez besoin d'un lien. Dans ce cas, vous pouvez utiliser get_permalink () , qui peut être utilisé en dehors de la boucle. Cela devrait faire ce dont vous avez besoin de manière plus fiable que d’utiliser le post slug.

    
réponse donnée Matthew Boynes 13.02.2012 - 05:55
la source
2

C'est peut-être une vieille question, mais j'ai créé les fonctions get_the_slug () et the_slug () en fonction de vos réponses.

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) );
    }
}
    
réponse donnée Earlee 29.08.2017 - 11:09
la source
0

Répondez simplement à la réponse de @Matthew Boynes. Si vous souhaitez également obtenir le slug parent (le cas échéant), cette fonction est utile:

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

Par exemple, pour ajouter la ou les limaces à la classe de corps:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );
    
réponse donnée bonger 12.02.2015 - 17:33
la source
0

Si vous souhaitez une réponse plus subtile, vous pouvez utiliser la requête SQL suivante pour extraire à tout moment tous les articles qui sont des publications, des pages ou des taxonomies personnalisées, même si aucun crochet n'a été tiré. pour l'instant.

SQL brut:

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

Cela fonctionne même sur la toute première ligne de votre fichier de fonctions, même avant les hooks mu_plugins_loaded ou init .

@note

Cela suppose que vous avez un préfixe de base de données standard wp_posts . Si vous avez besoin de prendre en compte les préfixes de variable, vous pouvez obtenir assez facilement le tableau de publication correct via PHP en procédant comme suit:

<?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';"

Ensuite, exécutez-vous avec $wpdb , mysqli ou une instance PDO . Comme il n'y a pas d'entrée d'utilisateur dans cette requête, il est prudent de l'exécuter sans une instruction préparée tant que vous n'y injectez aucune variable.

Je suggérerais de stocker cela en tant que valeur statique privée d'une classe, afin de pouvoir y accéder sans avoir à relancer la requête plusieurs fois par page pour obtenir de meilleures performances, comme suit:

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;
        {
    }
}

Utilisation

$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
}

Vous avez l'essentiel. Si vous avez besoin de plus de détails, vous pouvez les récupérer comme d'habitude avec new \WP_Post( get_the_ID() );

Ceci vous permettra de vérifier les publications à tout moment, même si la boucle wordpress n’a pas atteint un point où elle juge votre demande agréable. Il s'agit d'une version légèrement plus optimisée de la même requête exécutée par le noyau Wordpress lui-même. Celui-ci filtre toutes les informations indésirables que vous ne voudriez pas voir renvoyées et vous donne simplement une liste bien organisée avec l'identifiant de l'auteur, le type de publication, le slug et la visibilité appropriés. Si vous avez besoin de plus d'informations, vous pouvez les récupérer comme d'habitude avec new \WP_Post($id); ou utiliser l'une des autres fonctions Wordpress natives avec l'une des lignes de la table appropriées, même en dehors de la boucle.

J'utilise une configuration similaire dans quelques-uns de mes propres thèmes et plugins personnalisés, et cela fonctionne très bien. Il est également sécurisé et ne laisse pas de données internes flottantes dans la portée globale où elles peuvent être remplacées, comme le font la plupart des éléments de Wordpress.

    
réponse donnée mopsyd 23.03.2018 - 02:43
la source
0

C’est la fonction à utiliser pour récupérer le slug en dehors de la boucle.

get_post_field( 'post_name');

La réponse trouvée ici: Comment récupérer le slug de la page actuelle dans WordPress?

    
réponse donnée Kash 24.11.2018 - 17:03
la source
-1

Appel de page dynamique dans WordPress.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
    
réponse donnée Sujoy Bhowmick 14.02.2017 - 05:05
la source

Lire d'autres questions sur les étiquettes