Come posso recuperare lo slug della pagina corrente?
11 risposta
- voti
-
-
Grazie.Latua soluzionefunziona allagrande.Ho solobisogno di ripetere lo slug: ` Php global $post; $post_slug=$post->post_name;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
-
Come ha detto sarytash,devi "riecheggiarlo".Quindi,questo sarebbe l'ideale: ` Phpglobal $post;echo $post->post_name;?> `Like sarytash said, you need to `echo` it. So, this'd be ideal: `post_name; ?>`
- 2
- 2013-10-11
- its_me
-
Che dire di [`$ 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
Comeper altre risposte,lo slug èmemorizzatonellaproprietà
post_name
.Anche se potrebbe essere accessibile direttamente,preferisco lafunzioneget_post_field()
(sottoutilizzata)per accedere alleproprietà deipost chenon hanno un'API adeguataper loro.Richiede unpostfornitoin modoesplicitoe nonpredefinito su quello corrente,quindiperinteroperilpost corrente sarebbe:
$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() );
-
Vale lapenanotare che se seinel ciclopuoi usare `get_post_field` senza secondo argomento ([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
MODIFICA 5 APRILE 2016
Dopo aver scavatopermaggiore affidabilità,hofinitoperfare questa risposta al seguentepost cheporta a questamodifica : ( Assicurati di controllarlo )
Ilmetodopiù affidabilefino ad oggi che sono riuscito atrovare è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 questomodo,sei sicuro al 99,9999% di ottenere ogni voltai dati corretti.
RISPOSTA ORIGINALE
Un'altra alternativapiù sicura a questoproblema è usare
get_queried_object()
che contiene l'oggetto correnteinterrogatoper ottenere lo slug dellapagina che ètenuto dallaproprietàpost_name
. Puòessere utilizzato ovunqueneltuomodello.$post
puòessere utilizzato,mapuònonessere affidabilepoiché qualsiasi querypersonalizzata o codicepersonalizzatopuòmodificareil valore di$post
,quindi dovrebbeessereevitato al difuoriil cappio.L'uso di
get_queried_object()
per ottenere l'oggetto dellapagina corrente èmoltopiù affidabileed èmenoprobabile che vengamodificato,ameno chetunon stia usandoilmalvagioquery_posts
cheinterrompeilmain oggetto query,ma dipendetutto date.Puoi utilizzare quanto sopra come segue
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;
-
Devo dire che `query_posts`non èmalvagio *** quando vuoimodificare la queryprincipale ***,chetuttavia di solitonon lofaied è spesso abusata :)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
-
-
questo dipende dalleimpostazioni delpermalink.Se si utilizza l'impostazione "semplice",i collegamenti appariranno come "http://dominio/? P=123",lasciandovi con "? 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
-
@Mene è vero,ma la domanda è come ottenere lo slug che,di solito,significa che cen'è unonell'URL (GET arg `p`non è uno 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
-
Questo è un rivestimento cosìpulito: D.This is such a neat one liner :D
- 0
- 2020-03-13
- Sean Doherty
-
-
- 2012-02-13
Datoil codice diesempio,sembra che ciò di cui hai veramentebisogno sia un collegamento.Intal caso,puoi utilizzare get_permalink () ,chepuòessere utilizzato al difuori del ciclo.Questo dovrebbefare ciò di cui haibisognoin modopiù affidabile rispetto all'utilizzo delpost slug.
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.
-
Tuttavia,questo è l'URL completo,non solo lo slug.This is the full URL though, not just the slug.
- 4
- 2014-11-21
- Fred
-
- 2017-08-29
Potrebbeessere una vecchia domanda,ma ho creato lefunzioniget_the_slug ()e the_slug ()in base alletue 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) ); } }
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
Onestamentenon capiscoperchénessuna delle risposte lofa 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. }
Funzionapertuttii post,pagine,percorsipersonalizzati.
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.
-
"Onestamentenon capiscoperchénessuna delle rispostefa semplicemente: ..." Probabilmenteperché `$ wp-> request`include laparte delpercorso * completo * dell'URL,*** comprese le sottocartelle ***.Questo codicefunzionerà solo supost/pagine che sitrovano a livello di root."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
-
Questa è lamigliore risposta a questa domanda:niente hafunzionatofino a quandonon l'hoprovato.This is the best answer to this question - nothing worked until I tried this.
- 0
- 2020-08-14
- Chris
-
- 2018-03-23
Se desideri una rispostapiù approfondita,puoi utilizzare la seguente query SQLper recuperaretuttii post che sonopost,pagine otassonomiepersonalizzatein qualsiasimomento,anche senessun hook è stato attivato come di ancora.
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`;
Funziona anche sullaprima riga delfile dellefunzioni,ancheprima degli hook
mu_plugins_loaded
oinit
.<"@note"
Questopresuppone chetu abbia unprefisso di database standard
wp_posts
. Se devitenere conto deiprefissi delle variabili,puoi ottenere latabella deipost correttatramite PHP abbastanzafacilmentefacendo 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`;"
Quindiesegui con
$wpdb
,mysqli
o un'istanzaPDO
. Poichénon vi è alcuninput dell'utentein questa query,è sicuroeseguirla senza un'istruzionepreparatapurchénon viinserisca alcuna variabile.Suggerirei dimemorizzarlo come valore staticoprivato di una classe,in modo che siapossibile accedervi senza dover attivarenuovamente la querypiù di una voltaperpaginaper ottenere lemiglioriprestazioni,qualcosa delgenere:
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 }
Hai capito. Se haibisogno di ulteriori dettagli,puoi recuperarlinormalmente con
new \WP_Post( get_the_ID() );
Questoti permetterà di controllarei postin qualsiasimomento,anche seil ciclo wordpressnon ha raggiunto unpuntoin cuitrova latua richiestagradevole. Questa è una versione leggermentepiù ottimizzata della stessa queryeseguita dal core di Wordpress stesso. Questofiltratutta la spazzatura chenon vorresti restituiree ti offre solo unelencoben organizzato con l'id dell'autore,iltipo dipost,lo sluge la visibilitàpertinenti. Se haibisogno di ulteriori dettagli,puoi recuperarlinormalmente con
new \WP_Post($id);
,o utilizzare una qualsiasi delle altrefunzioninative di Wordpress con una qualsiasi delle righe dellatabellapertinenti,anche al difuori diil ciclo.Utilizzo una configurazione similein unpaio ditemi epluginpersonalizzatie funziona allagrande. È anche sicuroe non lasciai datiinterni chefluttuanonell'ambitoglobalein cuipossonoessere sovrascritti come lamaggiorparte delle cosein 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
Questa è lafunzione da usare quando si desidera recuperare lo slug al difuori del ciclo.
get_post_field( 'post_name');
Rispostatrovata qui: Come recuperare lo slug dellapagina correntein 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?
-
Effettivamente,ma devipassare $post o l'ID delpost come secondo argomento.Indeed, but you need to pass $post or ID of the post as a second argument.
- 0
- 2019-10-17
- trainoasis
-
- 2015-02-12
Solopiù avantinella risposta di @Matthew Boynes,se seiinteressato a ottenere anche lo sluggenitore (sepresente),allora hotrovato utile questafunzione:
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; }
Adesempio,per aggiungeregli slug alla classe del corpo:
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
Chiamata dinamica dellapaginain WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Dynamic Page calling in WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Sto cercando di recuperare lo slug dellapagina corrente di WordPressfuori dal ciclo.Iltitolo dellapagina ritorna con
wp_title ()
,ma comeposso ottenere lo slug?