Как получить слаг текущей страницы?
11 ответ
- голосов
-
-
Спасибо.Ваше решение отлично работает.Просто нужно повторить слизняк: ` Php global $post; $post_slug=$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
-
Как сказал сарыташ,вам нужно "повторить" это.Итак,это было бы идеально: ` 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
-
А как насчет [`$ 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
Согласно другим ответам,слаг хранится в свойстве
post_name
.Хотя к нему можно получить прямой доступ,я предпочитаю (недостаточно используемую) функциюget_post_field()
для доступа к свойствам сообщения,для которых нет подходящего API.Он требует явного предоставления сообщения и не по умолчанию используется для текущего сообщения,поэтому полностью для текущего сообщения это будет:
$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() );
-
Стоит отметить,что если вы находитесь в цикле,вы можете использоватьget_post_field без второго аргумента ([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
ИЗМЕНИТЬ 5 АПРЕЛЯ 2016 г.
Покопавшись для большей надежности,я закончил этим ответом на следующий пост,который приводит к этому редактированию. : ( Не забудьте проверить )
На сегодняшний день самый надежный метод,который я мог придумать,следующий:
// 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;
Таким образом,вы на 99,9999% уверены,что каждый раз получаете правильные данные.
ОРИГИНАЛЬНЫЙ ОТВЕТ
Другой более безопасной альтернативой этой проблемы является использование
get_queried_object()
,который содержит текущий запрашиваемый объект для получения ярлыка страницы,который содержится в свойствеpost_name
. Это можно использовать в любом месте вашего шаблона.$post
можно использовать,но он может быть ненадежным,поскольку любой пользовательский запрос или пользовательский код могут изменить значение$post
,поэтому его следует избегать за пределами петля.Использование
get_queried_object()
для получения объекта текущей страницы намного более надежно и с меньшей вероятностью будет изменено,если только вы не используете злойquery_posts
,который нарушает основные объект запроса,но это все зависит от вас.Вы можете использовать приведенное выше,как показано ниже
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;
-
Я должен сказать,что `query_posts` не является злом ***,когда вы хотите изменить основной запрос ***,что,однако,обычно не используется и часто используется неправильно :)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
-
-
это зависит от настроек постоянной ссылки.Если вы используете "простой" параметр,ссылки будут выглядеть как `http://domain/? P=123`,в результате вы получите`? 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
-
@Menetrue,но вопрос в том,как получить слаг,который,как правило,означает,что он есть в URL-адресе (GET arg `p` не является слагом).@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
-
Вот такой аккуратный лайнер: DThis is such a neat one liner :D
- 0
- 2020-03-13
- Sean Doherty
-
-
- 2012-02-13
Учитывая пример кода,похоже,что вам действительно нужна ссылка.В этом случае вы можете использовать get_permalink () ,который можно использовать вне цикла.Это должно делать то,что вам нужно,более надежно,чем использование ярлыка сообщения.
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.
-
Однако это полный URL,а не только ярлык.This is the full URL though, not just the slug.
- 4
- 2014-11-21
- Fred
-
- 2017-08-29
Возможно,это старый вопрос,но я создал функцииget_the_slug () иthe_slug () на основе ваших ответов.
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
Честно говоря,я не понимаю,почему ни один из ответов просто не работает:
global $wp; $current_slug = $wp->request; // Given the URL of https://example.com/foo-bar if ($current_slug === 'foo-bar') { // the condition will match. }
Это работает для всех сообщений,страниц,пользовательских маршрутов.
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.
-
«Я,честно говоря,не понимаю,почему ни один из ответов просто не делает: ...» Вероятно,потому что `$ wp-> request` включает часть URL * полного * пути,*** включая подпапки ***.Этот код будет работать только с сообщениями/страницами корневого уровня."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
-
Это лучший ответ на этот вопрос - ничего не работало,пока я не попробовал это.This is the best answer to this question - nothing worked until I tried this.
- 0
- 2020-08-14
- Chris
-
- 2018-03-23
Если вы хотите получить более подробный ответ,вы можете использовать следующий SQL-запрос для получения всех сообщений,которые являются сообщениями,страницами или пользовательскими таксономиями,в любое время,даже если никакие перехватчики не сработали,поскольку еще.
Необработанный 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`;
Это работает даже с самой первой строкой файла функций,даже до хуков
mu_plugins_loaded
илиinit
.< sizes@note
Предполагается,что у вас есть стандартный префикс базы данных
wp_posts
. Если вам нужно учитывать префиксы переменных,вы можете легко получить правильную таблицу сообщений через PHP,выполнив следующие действия:<?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`;"
Затем запустите с экземпляром
$wpdb
,mysqli
илиPDO
. Поскольку в этом запросе нет пользовательского ввода,его можно безопасно выполнять без подготовленного оператора,если вы не вводите в него какие-либо переменные.Я бы посоветовал сохранить это как частное статическое значение класса,чтобы к нему можно было получить доступ без необходимости повторного запуска запроса более одного раза на страницу для лучшей производительности,примерно так:
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; { } }
< sizesИспользование
$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 }
Вы уловили суть. Если вам нужны дополнительные сведения,вы можете получить их,как обычно,с помощью
new \WP_Post( get_the_ID() );
Это позволит вам проверять сообщения в любое время,даже если цикл wordpress не достиг точки,в которой он сочтет ваш запрос приемлемым. Это немного более оптимизированная версия того же запроса,выполняемого самим ядром Wordpress. Он отфильтровывает весь мусор,который вы не хотите возвращать,и просто предоставляет вам хорошо организованный список с соответствующим идентификатором автора,типом сообщения,слагом и видимостью. Если вам нужны дополнительные сведения,вы можете получить их,как обычно,с помощью
new \WP_Post($id);
или использовать любую из других встроенных функций Wordpress с любой из соответствующих строк таблицы,даже за пределами петля.Я использую аналогичную настройку в паре моих собственных тем и плагинов,и она отлично работает. Это также безопасно и не оставляет внутренние данные плавающими в глобальной области,где их можно переопределить,как это делает большинство вещей в 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
Это функция,которую нужно использовать,когда нужно получить ярлык вне цикла.
get_post_field( 'post_name');
Ответ найден здесь: Как получить слаг текущей страницыв 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?
-
Конечно,но вам нужно передать $post или ID сообщения в качестве второго аргумента.Indeed, but you need to pass $post or ID of the post as a second argument.
- 0
- 2019-10-17
- trainoasis
-
- 2015-02-12
Сразу после ответа @Matthew Boynes,если вы заинтересованы в получении родительского слага (если есть),тогда я нашел эту функцию полезной:
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; }
Например,чтобы добавить пуллы в основной класс:
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
Вызов динамической страницы в WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Dynamic Page calling in WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Я пытаюсь получить ярлык текущей страницы WordPress вне цикла.Заголовок страницы возвращается с помощью
wp_title ()
,но как я могу получить слаг?