Comment récupérer le slug de la page actuelle?
11 réponses
- votes
-
-
Je vous remercie.Votre solutionfonctionnetrèsbien.Justebesoin defaire écho au slug: ` Php global $post; $post_slug=$post->nom_post;echo $post_slug; ?> `Thank you. Your solution works great. Just need to echo the slug: `post_name; echo $post_slug; ?>`
- 4
- 2012-02-13
- sarytash
-
Comme le dit sarytash,vous devezen faire l'écho.Donc,ce seraitidéal: ` Phpglobal $post;echo $post->nom_post;?> `Like sarytash said, you need to `echo` it. So, this'd be ideal: `post_name; ?>`
- 2
- 2013-10-11
- its_me
-
Qu'enest-il de [`$ WP_Post`] (https://codex.wordpress.org/Class_Reference/WP_Post)?What about [`$WP_Post`](https://codex.wordpress.org/Class_Reference/WP_Post)?
- 0
- 2019-04-24
- Peter Mortensen
-
-
- 2015-05-20
Commepour les autres réponses,le slugest stocké dans lapropriété
post_name
.Bien qu'elle puisse être accédée directement,je préfère lafonction (sous-utilisée)get_post_field()
pour accéder auxpropriétés depublication quin'ontpas d'API appropriéepourelles.Ilnécessite unmessagefourniexplicitementet ne correspondpaspar défaut à l'actuel,donc dans sonintégralitépour lemessage actuel,ce serait:
$slug = get_post_field( 'post_name', get_post() );
As per other answers, slug is stored in the
post_name
property. While it could be accessed directly, I prefer the (underused)get_post_field()
function for accessing post properties which have no proper API for them.It requires post provided explicitly and doesn't default to the current one, so in full for the current post it would be:
$slug = get_post_field( 'post_name', get_post() );
-
Ilest ànoter que si vous êtes dans laboucle,vouspouvez utiliser `get_post_field` sans second argument ([docs] (https://developer.wordpress.org/reference/functions/get_post_field/))It is worth noting that if you are in the loop you can use `get_post_field` without second argument ([docs](https://developer.wordpress.org/reference/functions/get_post_field/))
- 13
- 2016-06-16
- jmarceli
-
- 2015-05-21
MODIFIER LE 5 AVRIL 2016
Après avoir creusépourplus defiabilité,j'aifini parfaire cette réponse aumessage suivant quimène à cettemodification : ( Assurez-vous de le vérifier )
Laméthode laplusfiablejusqu'à cejour quej'aiputrouverest 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 cettefaçon,vous êtes sûr à 99,9999% d'obtenir lesbonnes données à chaquefois.
RÉPONSE ORIGINALE
Une autre alternativeplus sûre à ceproblème consiste à utiliser
get_queried_object()
qui contient l'objet actuellementinterrogépour obtenir le slug depage quiest détenupar lapropriétépost_name
. Celapeut être utilisén'importe où dans votremodèle.$post
peut être utilisé,maisilpeutne pas êtrefiable cartoute requête ou codepersonnalisépeutmodifier la valeur de$post
,il doit donc être évitéen dehors de laboucle.L'utilisation de
get_queried_object()
pour obtenir l'objet de lapage actuelleestbeaucoupplusfiableet estmoins susceptible d'êtremodifiée,àmoins que vousn'utilisiez lemaléfiquequery_posts
qui casse leprincipal objet de requête,mais alorstout dépend de vous.Vouspouvez utiliser ce quiprécède comme suit
if ( is_page() ) $slug = get_queried_object()->post_name;
EDIT 5 APRIL 2016
After digging for more reliability, I ended up doing this answer to the following post which leads to this edit: (Be sure to check it out)
The most reliable method till date I could come up with is the following:
// 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;
This way, you are 99.9999% sure that you get the correct data every time.
ORIGINAL ANSWER
Another safer alternative to this problem is using
get_queried_object()
which holds the current queried object to get the page slug which is held by thepost_name
property. This can be used anywhere in your template.$post
can be used, but it can be unreliable as any custom query or custom code can change the value of$post
, so it should be avoided outside of the loop.Using
get_queried_object()
to get the current page object is much more reliable and is less likely to be modified, unless you are using the evilquery_posts
which breaks the main query object, but then that is all up to you.You can use the above as follow
if ( is_page() ) $slug = get_queried_object()->post_name;
-
Je dois dire que `query_posts`n'estpasmal *** lorsque vous voulezmodifier la requêteprincipale ***,ce que vousne faitesgénéralementpaset est souventmal utilisé :)I must say that `query_posts` is not evil ***when you want to alter the main query***, which however you usually don't and is often misused :)
- 0
- 2018-03-03
- jave.web
-
-
cela dépend desparamètres depermalien.Si vous utilisez leparamètre "simple",les liens ressembleront à `http://domaine/? P=123`,vous laissant avec`? P=123`.this depends on the permalink settings. If you use the "simple" setting, links will look like `http://domain/?p=123`, leaving you with `?p=123`.
- 4
- 2016-10-14
- Mene
-
@Meneest vrai,mais la questionest de savoir comment obtenir le slug qui,généralement,signifie qu'il yen a un dans l'url (GET arg `p`n'estpas un slug).@Mene true, but question is how to get slug which, usually, means there is one in the url (GET arg `p` is not a slug).
- 1
- 2020-02-17
- jave.web
-
C'est une doubluretellement soignée: DThis is such a neat one liner :D
- 0
- 2020-03-13
- Sean Doherty
-
-
- 2012-02-13
Comptetenu de l'exemple de code,il semble que vous ayez vraimentbesoin d'un lien.Dans ce cas,vouspouvez utiliser get_permalink () ,quipeut être utiliséen dehors de laboucle.Cela devraitfaire ce dont vous avezbesoin demanièreplusfiable que d'utiliser le slug depublication.
Given the code example, it looks like what you really need is a link. In that case, you can use get_permalink(), which can be used outside of the loop. That should do what you need more reliably than using the post slug.
-
Il s'agit de l'URL complète,pas seulement du slug.This is the full URL though, not just the slug.
- 4
- 2014-11-21
- Fred
-
- 2017-08-29
Peut-être une vieille question,maisj'ai créé lesfonctionsget_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) ); } }
Might be an old question, but I created the functions get_the_slug() and the_slug() based on your answers.
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) ); } }
-
- 2019-04-09
Honnêtement,je ne comprendspaspourquoi aucune des réponsesne fait simplement:
global $wp; $current_slug = $wp->request; // Given the URL of https://example.com/foo-bar if ($current_slug === 'foo-bar') { // the condition will match. }
Celafonctionnepourtous les articles,pageset itinérairespersonnalisés.
I honestly don't understand why none of the answers simply do:
global $wp; $current_slug = $wp->request; // Given the URL of https://example.com/foo-bar if ($current_slug === 'foo-bar') { // the condition will match. }
This works for all posts, pages, custom routes.
-
"Honnêtement,je ne comprendspaspourquoi aucune des réponsesne fait simplement: ..." Probablementparce que `$ wp-> request`inclut lapartie * chemin complet * de l'URL,*** y compris les sous-dossiers ***.Ce codene fonctionnera que sur les articles/pages qui sont auniveau racine."I honestly don't understand why none of the answers simply do:..." Probably because `$wp->request` includes the *full* path part of the URL, ***including sub-folders***. This code will only work on posts/pages that are at root level.
- 1
- 2020-05-08
- FluffyKitten
-
C'est lameilleure réponse à cette question - rienn'afonctionnéjusqu'à ce quej'aieessayé ceci.This is the best answer to this question - nothing worked until I tried this.
- 0
- 2020-08-14
- Chris
-
- 2018-03-23
Si vous voulez une réponseplus discrète,vouspouvez utiliser la requête SQL suivantepour récupérertous lesmessages qui sont soit des articles,despages ou destaxonomiespersonnalisées àtoutmoment,même si aucun hookn'a été déclenché.pour lemoment.
SQLbrut:
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`;
Celafonctionnemême sur latoutepremière ligne de votrefichier defonctions,même avant les hooks
mu_plugins_loaded
ouinit
.<₹@note
Cela suppose que vous ayez unpréfixe debase de données standard
wp_posts
. Si vous avezbesoin detenir compte despréfixes de variables,vouspouvez obtenir latable depublication correcte via PHP assezfacilementen 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 avec
$wpdb
,mysqli
ou uneinstancePDO
. Commeiln'y apas d'entrée utilisateur dans cette requête,ilest sûr de s'exécuter sansinstructionpréparéetant que vousn'yinjectez aucune variable.Je suggérerais de stocker cecien tant que valeur statiqueprivée d'une classe,afin depouvoir y accéder sans avoir à lancer la requêteplus d'unefoisparpagepour demeilleuresperformances,quelque chose comme ceci:
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; { } }
$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 comprenez l'essentiel. Si vous avezbesoin deplus de détails,vouspouvez les récupérer comme d'habitude avec
new \WP_Post( get_the_ID() );
Cela vouspermettra de vérifier lesmessages àtoutmoment,même si laboucle wordpressn'apas atteint unpoint oùelletrouve votre demande acceptable. Il s'agit d'une version légèrementplus optimisée de lamême requêteexécutéepar lenoyau Wordpress lui-même. Celui-cifiltretous lesfichiersindésirables que vousne voudriezpas retourner,et vous donne simplement une listebien organisée avec l'ID d'auteur,letype depublication,le sluget la visibilité appropriés. Si vous avezbesoin deplus de détails,vouspouvez les récupérer comme d'habitude avec
new \WP_Post($id);
,ou utiliser l'une des autresfonctionsnatives de Wordpress avec l'une des lignes detableaupertinentes,mêmeen dehors de laboucle.J'utilise une configuration similaire dans quelques-uns demespropresthèmeset pluginspersonnalisés,et celafonctionnetrèsbien. Ilest également sécuriséet ne laissepas les donnéesinternesflottantes dans laportéeglobale oùellespeuvent être remplacées comme laplupart des choses dans Wordpress.
If you want a more under-the-hood answer, you can use the following SQL query to fetch all of the posts that are either posts, pages, or custom taxonomies at any time, even if no hooks have fired whatsoever as of yet.
Raw SQL:
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`;
This works even on the very first line of your functions file, even prior to the
mu_plugins_loaded
orinit
hooks.@note
This is assuming you have a standard database prefix
wp_posts
. If you need to account for variable prefixes, you can obtain the correct post table through PHP pretty easily by doing the following:<?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`;"
Then run with either
$wpdb
,mysqli
, or aPDO
instance. Since there is no user input in this query, it is safe to run without a prepared statement as long as you do not inject any variables into it.I would suggest storing this as a private static value of a class, so it can be accessed without having to fire the query again more than once per page for best performance, something like this:
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; { } }
Usage
$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 }
You get the gist. If you need further details, you can fetch them as per normal with
new \WP_Post( get_the_ID() );
This will let your check the posts at any time, even if the wordpress loop has not hit a point where it finds your request agreeable. This is a slightly more optimized version of the same query run by the Wordpress core itself. This one filters out all of the junk you would not want returned, and just gives you a nicely organized list with the relevant author id, post type, slug, and visibility. If you need further details, you can fetch them as per normal with
new \WP_Post($id);
, or use any of the other native Wordpress functions with any of the relevant table rows, even outside of the loop.I use a similar setup in a couple of my own custom themes and plugins, and it works pretty great. It's also secure and doesn't leave internal data floating around in the global scope where it can be overridden like most stuff in Wordpress does.
-
- 2018-11-24
C'est lafonction à utiliserpour récupérer le slugen dehors de laboucle.
get_post_field( 'post_name');
Réponsetrouvéeici: Comment récupérer le slug de lapage actuelledans WordPress?
This is the function to use when wanting to retrieve the slug outside of the loop.
get_post_field( 'post_name');
Answer found here: How to Retrieve the Slug of Current Page in WordPress?
-
Eneffet,mais vous devezpasser $post ou ID dupost comme deuxième argument.Indeed, but you need to pass $post or ID of the post as a second argument.
- 0
- 2019-10-17
- trainoasis
-
- 2015-02-12
Justeplus loin sur la réponse de @Matthew Boynes,si vous souhaitez obtenir le slugparent (le cas échéant) également,j'aitrouvé cettefonction 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; }
Parexemple,pour ajouter le (s) slug (s) à la classebody:
function mytheme_body_class( $classes ) { if ( $slugs = mytheme_get_slugs() ) { $classes = array_merge( $classes, $slugs ); } return $classes; } add_filter( 'body_class', 'mytheme_body_class' );
Just further on @Matthew Boynes answer, if you're interested in getting the parent slug (if any) also then I've found this function useful:
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; }
Eg to add the slug(s) to the body class:
function mytheme_body_class( $classes ) { if ( $slugs = mytheme_get_slugs() ) { $classes = array_merge( $classes, $slugs ); } return $classes; } add_filter( 'body_class', 'mytheme_body_class' );
-
- 2017-02-14
Appel depage dynamique dans WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Dynamic Page calling in WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
J'essaie de récupérer le slug de lapage WordPress actuelleen dehors de laboucle.Letitre de lapage revient avec
wp_title ()
,mais commentpuis-je obtenir le slug?