현재 페이지의 슬러그를 어떻게 검색합니까?
11 대답
- 투표
-
-
감사합니다.귀하의 솔루션은 훌륭하게 작동합니다.슬러그를 에코하기 만하면됩니다 :`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
-
sarytash가 말했듯이,당신은 그것을 '에코'해야합니다.그래서 이것은 이상적입니다 :`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
속성에 저장됩니다.직접 액세스 할 수는 수도 있지만 적절한 API가없는 게시물 속성에 액세스하려면 (잘 사용되지 않는)get_post_field()
함수를 선호합니다.명시 적으로 제공되는 게시물이 필요하며 현재 게시물이 기본값이 아니므로 현재 게시물의 전체 내용은 다음과 같습니다.
$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
2016 년 4 월 5 일 수정
더 많은 안정성을 위해 파헤친 후 다음 게시물에 이 답변 을 작성하여이 수정으로 이어졌습니다. : ( 꼭 확인하세요 )
지금까지 가장 신뢰할 수있는 방법은 다음과 같습니다.
// 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
의 값을 변경할 수 있으므로 신뢰할 수 없습니다. 루프.post_name
를 사용하여 현재 페이지 개체를 가져 오는 것이 훨씬 더 안정적이며 수정 될 가능성이 적습니다. 단,메인을 깨는 악의적 인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
-
@Mene 사실이지만 질문은 일반적으로 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
후크 이전에도 함수 파일의 첫 번째 줄에서도 작동합니다.@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; { } }
사용
$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 코어 자체에서 실행되는 동일한 쿼리의 약간 더 최적화 된 버전입니다. 이것은 반환하고 싶지 않은 모든 정크를 걸러 내고 관련 작성자 ID,게시물 유형,슬러그 및 가시성으로 잘 구성된 목록을 제공합니다. 추가 세부 정보가 필요한 경우
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');
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 페이지의 슬러그를 검색하려고합니다.페이지 제목은
<사전> <코드> & lt; li > & lt; a href="/slug-of-current-page/"> & lt;?php wp_title ( '',true);? > & lt;/a > & lt;/li >wp_title ()
과 함께 반환되지만 슬러그는 어떻게 얻을 수 있습니까?