현재 페이지의 슬러그를 어떻게 검색합니까?


99

루프 외부에서 현재 WordPress 페이지의 슬러그를 검색하려고합니다. 페이지 제목이로 표시 wp_title ()되지만 슬러그를 어떻게 얻을 수 있습니까?

<li>
  <a href="/slug-of-current-page/">
    <?php wp_title('', true); ?>
  </a>
</li>

답변:


151

전역 변수를 사용하십시오 $post.

<?php 
    global $post;
    $post_slug = $post->post_name;
?>

3
감사합니다. 귀하의 솔루션은 훌륭하게 작동합니다. 슬러그를 반향해야합니다.<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
sarytash

1
sarytash가 말했듯이 필요 echo합니다. 따라서 이것은 이상적 <?php global $post; echo $post->post_name; ?>
its_me

무엇에 대해 $WP_Post?
Peter Mortensen

68

다른 답변에 따라 슬러그가 post_name속성에 저장됩니다 . 직접 액세스 할 수는 있지만 get_post_field()적절한 API가없는 게시물 속성에 액세스하는 (사용하지 않는 ) 기능을 선호 합니다.

명시 적으로 제공 된 게시물이 필요하고 현재 게시물로 기본 설정되지 않으므로 현재 게시물에 대한 전체 내용은 다음과 같습니다.

$slug = get_post_field( 'post_name', get_post() );

12
그것은 당신이 루프에있는 경우 사용할 수 있음을 주목할 필요가있다 get_post_field두번째 인자없이 ( 문서 )
jmarceli

26

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있으므로 루프 외부에서 피해야합니다.

사용하여 get_queried_object()현재 페이지 개체를 가져 훨씬 더 안정적이며, 당신은 악을 사용하지 않는 경우, 수정 될 가능성이 적습니다 query_posts주요 질의 객체를 파괴하지만, 그 모두 당신에게 달려 있습니다.

위와 같이 사용할 수 있습니다

if ( is_page() )
    $slug = get_queried_object()->post_name;

난 그 말을해야 query_posts악의없는 메인 쿼리를 변경하고자 할 때 : 그러나 당신이 일반적으로하지 않습니다 종종 오용,
jave.web

11

슬러그를 얻는 간단한 방법은 다음과 같습니다.

<?php echo basename(get_permalink()); ?>

2
이것은 퍼머 링크 설정에 따라 다릅니다. "간단한"설정을 사용하면 링크가으로 표시되고을 (를 http://domain/?p=123) 남겨 둡니다 ?p=123.
Mene

8

코드 예제를 감안할 때 실제로 필요한 것은 링크입니다. 이 경우 루프 외부에서 사용할 수있는 get_permalink () 를 사용할 수 있습니다. 포스트 슬러그를 사용하는 것보다 필요한 것을 더 안정적으로해야합니다.


4
이것은 슬러그뿐만 아니라 전체 URL입니다.
Fred

2

오래된 질문 일지 모르지만 답변에 따라 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) );
    }
}


0

@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' );

0

보다 간단한 답변을 원한다면 다음 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후크 전에도 작동합니다 .

@노트

이것은 표준 데이터베이스 접두어가 있다고 가정합니다 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의 대부분의 항목처럼 재정의 할 수있는 전역 범위에서 내부 데이터를 떠 다니지 않습니다.


0

나는 정답을 찾지 못하는 이유를 솔직히 이해하지 못한다.

global $wp;
$current_slug = $wp->request;

// Given the URL of https://example.com/foo-bar
if ($current_slug === 'foo-bar') {
  // the condition will match.
}

모든 게시물, 페이지, 맞춤 경로에 적용됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.