WordPress에서 현재 페이지 이름을 어떻게 알 수 있습니까?


162

WordPress 테마에서 현재 페이지 이름을 검색하는 데 사용할 수있는 PHP 코드는 무엇입니까?

내가 지금까지 (본 모든 솔루션 the_title(), get_page()->post_name, get_post(), 등) 후 항목을 포함하는 페이지에 대한 작업을하지 않습니다. 그들은 모두 최신 블로그 항목의 이름을 반환합니다.

다른 방법으로 말하면, "My News"라는 이름으로 WordPress에 페이지가 생성되었다고 가정하십시오. 이 페이지는 "게시물 페이지"로 설정됩니다. 페이지에 몇 개의 게시물을 추가하십시오. 이제 최신 게시물 이름 대신 "my-news"문자열을 검색하기 위해 어떤 API를 사용할 수 있습니까?


작동하는 것처럼 보이는 다음 변수를 찾았습니다.

$wp_query->queried_object->post_name

이것은 실제로 페이지 이름 (슬러그)의 URL 친화적 인 버전이며, 내가 찾던 것입니다. 이것은 기본 템플릿 ( Twenty Ten ) 으로 테스트되었습니다 . 아래의 두 변수가 왜 내 사이트에서 작동하지 않는지 잘 모르겠습니다. 팁에 대한 keatchprint_r() 감사합니다 .

이제이 정보가 왜 그렇게 깊이 숨겨져 있습니까?


이름 사용 : single_post_title ( '', false); 슬러그 사용의 경우 : get_query_var ( 'pagename');
jtmielczarek

답변:


182

WordPress 전역 변수 $pagename를 사용할 수 있어야합니다. 방금 지정한 것과 동일한 설정으로 시도했습니다.

$pagename는 함수 내에서 wp-includes / theme.php 파일에 정의되어 있으며 get_page_template()페이지 테마 파일을 구문 분석하기 전에 호출되므로 페이지의 템플리트 내부에서 언제든지 사용할 수 있습니다.

  • 문서화 된 것으로 보이지는 않지만 $pagenamevar은 영구 링크를 사용하는 경우에만 설정됩니다. 나는 이것을 사용하지 않으면 WordPress에 페이지 슬러그가 필요하지 않으므로 설정하지 않기 때문입니다.

  • $pagename 페이지를 정적 프론트 페이지로 사용하는 경우에는 설정되지 않습니다.

    • 이것은 /wp-includes/theme.php의 코드이며, $pagename설정할 수 없을 때 지적한 솔루션을 사용합니다 .

      $ pagename = get_query_var ( 'pagename'); if (! $ pagename && $ id> 0) {// 정적 페이지가 첫 페이지로 설정되면 $ pagename이 설정되지 않습니다. 조회 된 오브젝트에서 검색하십시오. $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }


4
header.php 내부에서 $ pagename이 비어 있습니다. 기본 템플릿 (20)을 사용하고 <body> 태그 바로 다음에 사용하려고 시도했지만 설정되지 않았습니다. 또한 query_vars 변수는 해당 단계에서 설정되지 않은 것 같습니다.
Bernard

1
해당 변수가없는 이유를 알 수 없습니다. 설정이 잘못되었을 수 있습니다. 페이지 템플릿 내 에서이 작업을 시도하고 있음을 이해했습니다. header.php의 첫 번째 줄에 "echo $ pagename"이라고 쓰더라도 값을 주어야합니다. 어떤 버전의 WP를 다루고 있습니까?
AJJ

1
get_query_var ( 'pagename')을 사용하여 약간 다른 접근법을 시도 할 수 있습니다.
AJJ

@ AJweb : 예, 그것은 내가 만들고있는 템플릿을위한 것이지만 header.php 내에서 테스트를 위해 기본 템플릿을 사용하고 있습니다. 솔루션을 테스트하지 않았다는 인상을 받았습니다. header.php의 <body> 태그 바로 뒤에 <h1> <? php echo $ pagename?> </ h1>을 넣을 때 페이지 이름이 보입니까?
Bernard

1
이것은 나를 위해 트릭을했다 : $pagename = $wp_query->queried_object->post_name;, 그냥 설정 하는 것을 잊지 마십시오global $wp_query; !
Saran

39

페이지의 슬러그 이름을 얻는 나의 접근 방식 :

$slug = basename(get_permalink());

그들은 그들이 예쁜 URL을 사용하는 경우에만 작동합니까?
베티

24

루프 전에 페이지 제목을 가져와야합니다 .

$page_title = $wp_query->post->post_title;

참조를 확인하십시오 : http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

print_r($wp_query)

루프 전에 $wp_query객체 의 모든 값을 봅니다 .


1
이것은 작동하지 않습니다. <body> 태그 바로 다음에 $ wp_query 객체를 인쇄하면 첫 번째 게시물 객체가 페이지 자체가 아니라 블로그 항목임을 알 수 있습니다. 그러나 print_r () 팁에 감사드립니다. 찾고있는 정보가있는 변수를 찾을 수 있습니다 (이 정보를 질문에 넣음).
Bernard

$ page_title var가 헤더에서 나를 위해 일했다는 것을 알았습니다. 감사합니다.
Claire

22
<?php wp_title(''); ?>

이것은 나를 위해 일했습니다.

올바르게 이해하면 게시물 항목이있는 페이지에서 페이지 이름을 가져 오려고합니다.


10

전역 변수를 사용하여 현재 페이지, 게시물 또는 사용자 정의 게시물 유형을 얻을 수 있습니다 $post.

echo $post->post_title

참고 : 함수 또는 클래스에서는 사용 global $post;하기 전에 지정해야 합니다$post .

페이지에 루프가있는 경우 각 루프를 끝내고 wp_reset_postdata();설정하십시오.$post 표시되는 기본 항목 (페이지)으로 다시 .

'post_title'변수는 메뉴 항목 및 미디어 첨부 파일을 포함한 모든 사용자 정의 루프 / 쿼리에도 사용할 수 있습니다. WordPress의 모든 것은 '포스트'입니다.


이 답변은 2012 년부터입니다.이 방법이 최신 WP에서 여전히 작동하는지에 대한 지식이 있습니까?
마틴

1
네 그것은 포스트 유형의 처리의 핵심 변경되지 않았습니다-WP는 것
James

8

당신이 당신의 functions.php 파일 내에서 현재 페이지에 액세스하기 위해 찾고 있다면 (그래서, 전에 루프 전에 $post전에 채워집니다 $wp_query정말 선택의 여지가 있지만, 서버 변수 자체에 액세스 할 수 ... 등, 초기화) 및 쿼리 문자열에서 요청 된 페이지를 추출하십시오.

$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )

이 솔루션은 "멍청한"솔루션입니다. 예를 들어 슬러그 'coming-soon'이있는 페이지도 p=6입니다. 그리고 permalink 설정이로 설정되어 있다고 가정합니다.pagename (어쨌든 있어야합니다!)로 .

그러나 통제 된 시나리오가있는 경우 유용한 작은 방법이 될 수 있습니다. 로그인하지 않은 방문자를 "출시 예정"페이지로 리디렉션하려는 상황에서이를 사용하고 있습니다. 그러나 나는 그것들을 두려운 "리디렉션 루프"에 넣지 않도록해야하므로이 규칙에서 "출시 예정"페이지를 제외시켜야합니다.

global $pagenow;
if (
        ! is_admin() &&
        'wp-login.php' != $pagenow &&
        'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
        ! is_user_logged_in()
){
   wp_safe_redirect( 'coming-soon' );
}

7

Roots starter 테마 에는 현재 페이지 제목을 얻는 환상적인 기능이 있다고 생각합니다 . 그것은 매우 해킹 가능하고 모든베이스를 다루며 wp_title후크 와 함께 쉽게 사용할 수 있습니다 .

/**
 * Page titles
 */
function roots_title() {
  if (is_home()) {
    if (get_option('page_for_posts', true)) {
      echo get_the_title(get_option('page_for_posts', true));
    } else {
      _e('Latest Posts', 'roots');
    }
  } elseif (is_archive()) {
    $term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy'));
    if ($term) {
      echo $term->name;
    } elseif (is_post_type_archive()) {
      echo get_queried_object()->labels->name;
    } elseif (is_day()) {
      printf(__('Daily Archives: %s', 'roots'), get_the_date());
    } elseif (is_month()) {
      printf(__('Monthly Archives: %s', 'roots'), get_the_date('F Y'));
    } elseif (is_year()) {
      printf(__('Yearly Archives: %s', 'roots'), get_the_date('Y'));
    } elseif (is_author()) {
      $author = get_queried_object();
      printf(__('Author Archives: %s', 'roots'), $author->display_name);
    } else {
      single_cat_title();
    }
  } elseif (is_search()) {
    printf(__('Search Results for %s', 'roots'), get_search_query());
  } elseif (is_404()) {
    _e('Not Found', 'roots');
  } else {
    the_title();
  }
}


5

더 간단한 해결책을 생각해 냈습니다.

wp_title ()에서 페이지 이름의 리턴 값을 가져옵니다. 비어있는 경우 홈페이지 이름을 인쇄하고 그렇지 않으면 wp_title () 값을 에코하십시오.

<?php $title = wp_title('', false); ?>

첫 번째 인수로 분리를 제거한 다음 변수에 대한 입력으로 사용하려면 display를 false로 설정하십시오. 그런 다음 제목 등 태그 사이에 코드를 넣습니다.

<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>

그것은 나를 위해 치료를 받았고 첫 번째 부분을 추출하려는 섹션에서 선언 $title했는지 확인하면 다른 변수를 반환하도록 조정할 수 있습니다.




3

이것은 가장 사용하기 쉬운 것 같습니다 :

<?php single_post_title(); ?>

1
이 호출은 게시물을 포함하는 페이지 이름이 아닌 마지막 게시물 이름을 반환합니다. 적어도 테스트하지 않고 온라인 문서에서 이해하는 것입니다.
Bernard

이것이 바로 내가 찾던 것입니다. 내 페이지의 새 헤더를 만들었고 예상대로 페이지 이름이 표시되었습니다. 감사!
AJ Hernandez


2

페이지 ID 또는 슬러그가 아닌 실제 쿼리 된 페이지를 찾는 경우 쿼리를 가로채는 것이 하나의 옵션입니다.

add_action('parse_request', 'show_query', 10, 1);

함수 내에서 $ wp 객체에 액세스 할 수 있으며 다음을 사용하여 페이지 이름 또는 게시물 이름을 얻을 수 있습니다.

function show_query($wp){
     if ( ! is_admin() ){ // heck we don't need the admin pages
         echo $wp->query_vars['pagename'];
         echo $wp->query_vars['name'];
     }
}

반면에 실제로 포스트 데이터가 필요한 경우 가장 먼저 포스트 데이터를 얻는 것이 가장 중요합니다.

add_action('wp', 'show_page_name', 10, 1);

function show_page_name($wp){
     if ( ! is_admin() ){
        global $post;
        echo $post->ID, " : ", $post->post_name;
     }
}

마지막으로, 이것은 아마도 OP의 질문이 아니라는 것을 알고 있지만 관리자 페이지 이름을 찾고 있다면 global을 사용하십시오 $pagenow.



1

내 버전은 다음과 같습니다.

$title = ucwords(str_replace('-', ' ', get_query_var('pagename')));

get_query_var ( 'pagename')은 방금 페이지 슬러그를 제공했습니다. 위의 내용은 모든 대시를 대체하고 각 단어의 첫 글자를 대문자로 만듭니다. 따라서 실제로 제목으로 사용할 수 있습니다.


0

이것은 2018 년 현재 사용했던 것입니다.

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">

0

나는이 기능을 WordPress Codec 에서 찾았습니다 .

질문을 받다

의 래퍼입니다 $wp_query->get_queried_object.

이 게시물은 올바른 방향으로 안내했지만이 업데이트가 필요한 것 같습니다.


0

functions.php에있는 경우에도 작동합니다. 전역 배열을 사용해야하기 때문에 가장 좋은 방법은 아니지만 작동합니다.

  1. 먼저 필터를 추가해야합니다. template_include보다 사용하기에 더 나은 필터가 있어야하지만 모든 필터를 모릅니다. 올바른 점을 알려주세요.

    add_filter( 'template_include', 'var_template_include', 1000 );
    function var_template_include( $template ){
        global $wp_query;
        $GLOBALS['current_page'] = $wp_query->get_queried_object()->post_name;
        return $template;
    }
  2. 변수를 직접 사용하지 마십시오

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. 이제 functions.php의 get_current_page()다른 부분에서 함수 를 사용할 수 있습니다 .

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