Wie rufe ich den Slug der aktuellen Seite ab?
11 Antworten
- Stimmen
-
-
Vielen Dank.Ihre Lösungfunktioniert hervorragend.Ichmussnur die Schnecke wiederholen: ` 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
-
Wie Sarytash sagte,müssen Siees "wiederholen".Das wäre alsoideal: ` 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
-
Wasistmit [`$ 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
Gemäß anderen Antworten wird der Slugin der Eigenschaft
post_name
gespeichert.Während auf direkt zugegriffen werden kann ,bevorzugeich die (nicht ausreichendgenutzte) Funktionget_post_field()
für den Zugriff auf Post-Eigenschaften,für die keinegeeignete API vorhandenist.Eserforderteinen explizitbereitgestellten Beitrag und verwendetnicht standardmäßig den aktuellen. Für den aktuellen Beitrag wäre dies also vollständig:
$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() );
-
Esisterwähnenswert,dass Sie,wenn Sie sichin der Schleifebefinden,"get_post_field" ohne zweites Argument verwenden können ([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
EDIT 5. APRIL 2016
Nachdemichnachmehr Zuverlässigkeitgesucht hatte,führteich diese Antwort auf denfolgenden Beitrag aus,der zu dieser Bearbeitungführt : ( Schauen Sie sich das unbedingt an )
Diebisher zuverlässigste Methode,dieichfinden konnte,ist diefolgende:
// 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;
Auf diese Weise sind Sie zu 99,9999% sicher,dass Siejedes Mal die richtigen Datenerhalten.
URSPRÜNGLICHE ANTWORT
Eine weitere sicherere Alternative zu diesem Problemist die Verwendung von
get_queried_object()
,das das aktuell abgefragte Objektenthält,um den Seiten-Slug abzurufen,der von der Eigenschaftpost_name
gehalten wird. Dies kann überallin Ihrer Vorlage verwendet werden.$post
kann verwendet werden,kannjedoch unzuverlässig sein,dajedebenutzerdefinierte Abfrage oderjederbenutzerdefinierte Code den Wert von$post
ändern kann. Daher sollteer außerhalb von vermieden werden die Schleife.Die Verwendung von
get_queried_object()
zum Abrufen des aktuellen Seitenobjektsist viel zuverlässiger und wirdmit geringerer Wahrscheinlichkeitgeändert,es sei denn,Sie verwenden diebösenquery_posts
,die die Hauptfunktion unterbrechen Objekt abfragen,aber dann liegt allesbei Ihnen.Sie können die obengenannten Schritte wiefolgt verwenden:
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;
-
Ichmuss sagen,dass `query_posts`nichtböseist ***,wenn Sie die Hauptabfrage *** ändernmöchten,was Siejedochnormalerweisenichttun und oftmissbraucht werden :)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
-
-
Dies hängt von den Permalink-Einstellungen ab.Wenn Sie die Einstellung "einfach" verwenden,sehen die Links wie "http://domain/? P=123" aus,sodass Sie "? P=123"erhalten.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 stimmt,aber die Frageist,wiemaneinen Slugbekommt,wasnormalerweisebedeutet,dasseseinen in der URLgibt (GET arg `p`ist kein 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
-
Diesist soein ordentlicher Einzeiler: D.This is such a neat one liner :D
- 0
- 2020-03-13
- Sean Doherty
-
-
- 2012-02-13
Angesichts des Codebeispiels siehtes so aus,als ob Sie wirklicheinen Linkbenötigen.In diesem Fall können Sie get_permalink () verwenden,das außerhalb der Schleife verwendet werden kann.Das sollte zuverlässiger dastun,was Siebrauchen,als die Post-Schnecke zu verwenden.
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.
-
Diesistjedoch die vollständige URL,nichtnur der Slug.This is the full URL though, not just the slug.
- 4
- 2014-11-21
- Fred
-
- 2017-08-29
Könnteeine alte Frage sein,aberich habe die Funktionenget_the_slug () undthe_slug ()basierend auf Ihren Antwortenerstellt.
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
Ich versteheehrlichgesagtnicht,warum keine der Antworteneinfach Folgendestut:
global $wp; $current_slug = $wp->request; // Given the URL of https://example.com/foo-bar if ($current_slug === 'foo-bar') { // the condition will match. }
Diesfunktioniertfür alle Beiträge,Seiten undbenutzerdefinierten Routen.
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.
-
"Ich versteheehrlichgesagtnicht,warum keine der Antworteneinfach Folgendesbewirkt: ..." Wahrscheinlich,weil "$ wp-> request" den * vollständigen * Pfadteil der URLenthält,***einschließlich Unterordner ***.Dieser Codefunktioniertnurfür Beiträge/Seiten,die sich auf Stammebenebefinden."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
-
Diesist diebeste Antwort auf diese Frage -nichts hatfunktioniert,bisiches versucht habe.This is the best answer to this question - nothing worked until I tried this.
- 0
- 2020-08-14
- Chris
-
- 2018-03-23
Wenn Sieeine umfassendere Antwort wünschen,können Siemit derfolgenden SQL-Abfragejederzeit alle Posts abrufen,bei denenes sichentweder um Posts,Seiten oderbenutzerdefinierte Taxonomien handelt,auch wenn überhaupt keine Hooks ausgelöst wurden vonnoch.
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`;
Diesfunktioniertbereitsin derersten Zeile Ihrer Funktionsdatei,noch vor den Hooks
mu_plugins_loaded
oderinit
.@note
Dies setzt voraus,dass Sieein Standard-Datenbankpräfix
wp_posts
haben. Wenn Sie variable Präfixeberücksichtigenmüssen,können Sie die richtige Post-Tabelleganzeinfach über PHPerhalten,indem Siefolgende Schritte ausführen:<?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`;"
Führen Sie dannentweder
$wpdb
,mysqli
odereinePDO
-Instanz aus. Da diese Abfrage keine Benutzereingabenenthält,kann sie ohne vorbereitete Anweisung ausgeführt werden,solange Sie keine Variablenin sieeinfügen.Ich würde vorschlagen,dies alsprivaten statischen Werteiner Klasse zu speichern,damit auf sie zugegriffen werden kann,ohne dass die Abfragemehr alseinmalpro Seiteerneut ausgelöst werdenmuss,um diebeste Leistung zuerzielen.
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; { } }
Verwendung
$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 }
Sie verstehen das Wesentliche. Wenn Sie weitere Detailsbenötigen,können Sie diese wiegewohntmit
abrufennew \WP_Post( get_the_ID() );
Auf diese Weise können Sie die Beiträgejederzeit überprüfen,auch wenn die WordPress-Schleifenoch keinen Punkterreicht hat,an dem Ihre Anfragefür akzeptabelbefunden wird. Diesisteine etwas optimierte Version derselben Abfrage,die vom Wordpress-Kern selbst ausgeführt wird. Dieserfiltert dengesamten Müll heraus,den Sienicht zurückgebenmöchten,undgibt Ihnennureine übersichtliche Listemit der relevanten Autoren-ID,dem Post-Typ,dem Slug und der Sichtbarkeit. Wenn Sie weitere Detailsbenötigen,können Sie diese wiegewohntmit
new \WP_Post($id);
abrufen odereine der anderennativen Wordpress-Funktionenmit einer der relevanten Tabellenzeilen verwenden,auch außerhalb von die Schleife.Ich verwendeein ähnliches Setupin einigenmeinereigenen benutzerdefinierten Designs und Plugins undesfunktioniert ziemlichgut. Esist auch sicher und lässtinterne Datennichtim globalen Bereich schweben,wo sie überschrieben werden können,wiees diemeisten Dingein Wordpresstun.
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
Diesist die Funktion,die verwendet werden soll,wenn der Slug außerhalb der Schleife abgerufen werden soll.
get_post_field( 'post_name');
Hiergefundene Antwort: So rufen Sie den Slug of Current Page abin 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?
-
In der Tat,aber Siemüssen $post oder ID des Beitrags als zweites Argument übergeben.Indeed, but you need to pass $post or ID of the post as a second argument.
- 0
- 2019-10-17
- trainoasis
-
- 2015-02-12
{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; }
Zum Beispiel,um die Schnecke (n) zur Körperklasse hinzuzufügen:
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
Dynamischer Seitenaufrufin WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Dynamic Page calling in WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Ich versuche,den Slug der aktuellen WordPress-Seite außerhalb der Schleife abzurufen.Der Titel der Seite wirdmit
wp_title ()
zurückgegeben,aber wie kannich den Slugerhalten?