답변:
다른 답변에 따라 슬러그가 post_name
속성에 저장됩니다 . 직접 액세스 할 수는 있지만 get_post_field()
적절한 API가없는 게시물 속성에 액세스하는 (사용하지 않는 ) 기능을 선호 합니다.
명시 적으로 제공 된 게시물이 필요하고 현재 게시물로 기본 설정되지 않으므로 현재 게시물에 대한 전체 내용은 다음과 같습니다.
$slug = get_post_field( 'post_name', get_post() );
신뢰성을 높이기 위해 다음 게시물 에이 답변 을 작성 하여이 편집으로 이어졌습니다. ( 확인해야합니다 )
지금까지 내가 올 수있는 가장 신뢰할 수있는 방법은 다음과 같습니다.
// 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
악의없는 메인 쿼리를 변경하고자 할 때 : 그러나 당신이 일반적으로하지 않습니다 종종 오용,
코드 예제를 감안할 때 실제로 필요한 것은 링크입니다. 이 경우 루프 외부에서 사용할 수있는 get_permalink () 를 사용할 수 있습니다. 포스트 슬러그를 사용하는 것보다 필요한 것을 더 안정적으로해야합니다.
오래된 질문 일지 모르지만 답변에 따라 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) );
}
}
루프 외부의 슬러그를 검색 할 때 사용하는 기능입니다.
get_post_field( 'post_name');
여기에 답이 있습니다 : WordPress에서 현재 페이지의 슬러그를 검색하는 방법?
@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' );
보다 간단한 답변을 원한다면 다음 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의 대부분의 항목처럼 재정의 할 수있는 전역 범위에서 내부 데이터를 떠 다니지 않습니다.
WordPress에서 동적 페이지 호출
<?php
get_template_part('foldername/'.basename(get_permalink()),'name');
?>
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>