Làm cách nào để có được tên trang hiện tại trong WordPress?


162

Mã PHP nào có thể được sử dụng để lấy tên trang hiện tại trong một chủ đề WordPress?

Tất cả các giải pháp tôi đã thấy cho đến nay ( the_title(), get_page()->post_name, get_post(), vv) không làm việc cho một trang có chứa bài mục. Tất cả họ sẽ trả lại tên của mục blog mới nhất.

Nói cách khác, giả sử rằng bạn có một trang được tạo trong WordPress với tên "Tin tức của tôi". Trang này được đặt là "trang bài". Thêm một vài bài viết vào trang. Bây giờ, API nào có thể được sử dụng để truy xuất chuỗi "tin tức của tôi" thay vì tên của bài đăng mới nhất?


Tôi đã tìm thấy biến sau đây có vẻ hoạt động.

$wp_query->queried_object->post_name

Đây thực sự là phiên bản thân thiện với URL của tên trang (sên), đây cũng là thứ tôi đang tìm kiếm. Điều này đã được thử nghiệm với mẫu mặc định ( Twenty Ten ). Tôi thực sự không chắc chắn tại sao hai biến được đưa ra dưới đây không hoạt động trên trang web của tôi. Cảm ơn keatch cho tiền print_r()boa .

Bây giờ, tại sao thông tin này được ẩn sâu như vậy?


đối với Tên sử dụng: single_post_title ('', false); để sử dụng sên: get_query_var ('pagename');
jtmielczarek

Câu trả lời:


182

Biến toàn cầu WordPress $pagenamenên có sẵn cho bạn. Tôi vừa thử với cùng một thiết lập bạn đã chỉ định.

$pagenameđược định nghĩa trong tệp wp-gộp / theme.php, bên trong hàm get_page_template(), tất nhiên được gọi trước khi tệp chủ đề trang của bạn được phân tích cú pháp, do đó, nó có sẵn tại bất kỳ điểm nào trong các mẫu của bạn cho các trang.

  • Mặc dù nó dường như không được ghi lại, $pagenamevar chỉ được đặt nếu bạn sử dụng permalinks. Tôi đoán điều này là bởi vì nếu bạn không sử dụng chúng, WordPress không cần sên trang, vì vậy nó không thiết lập nó.

  • $pagename không được đặt nếu bạn sử dụng trang làm trang đầu tĩnh.

    • Đây là mã bên trong /wp-includes/theme.php, sử dụng giải pháp bạn đã chỉ ra khi $pagenamekhông thể được đặt:

      $ pagename = get_query_var ('pagename'); if (! $ pagename && $ id> 0) {// Nếu một trang tĩnh được đặt làm trang đầu, $ pagename sẽ không được đặt. Lấy nó từ đối tượng được truy vấn $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }


4
$ pagename trống khi được sử dụng bên trong header.php. Tôi đã thử sử dụng mẫu mặc định (hai mươi giây) và sử dụng nó ngay sau thẻ <body> nhưng nó không được đặt. Ngẫu nhiên, dường như không có biến truy vấn nào được đặt ở giai đoạn đó.
Bernard

1
Tôi không thể thấy bất kỳ lý do cho sự vắng mặt của biến đó, có lẽ tôi đã hiểu nhầm thiết lập của bạn? Tôi hiểu bạn đang cố gắng làm điều này trong một mẫu trang. Ngay cả khi bạn viết "echo $ pagename" trong dòng đầu tiên của tệp.php, nó sẽ cung cấp cho bạn giá trị. Phiên bản WP nào bạn đang xử lý?
AJJ

1
Bạn có thể thử một cách tiếp cận hơi khác bằng cách sử dụng get_query_var ('pagename').
AJJ

@AJweb: Vâng, đó là một mẫu mà tôi đang xây dựng nhưng tôi đang sử dụng mẫu mặc định để thử nghiệm, bên trong tiêu đề.php. Tôi có ấn tượng rằng bạn chưa thử nghiệm giải pháp của bạn. Bạn có thấy tên trang khi bạn đặt <h1> <? Php echo $ pagename không?> </ H1> ngay sau thẻ <body> trong header.php?
Bernard

1
Điều này đã làm các trick cho tôi: $pagename = $wp_query->queried_object->post_name;, chỉ cần đừng quên để thiết lập global $wp_query;trước!
Saran

38

Cách tiếp cận của tôi để có được tên sên của trang:

$slug = basename(get_permalink());

Điều này chỉ hoạt động nếu họ sử dụng url đẹp, phải không?
Betty

24

Ok, bạn phải lấy tiêu đề trang trước vòng lặp.

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

Kiểm tra tham chiếu: http://codex.wordpress.org/Function_Reference/WP_Query#Properies .

Làm một

print_r($wp_query)

trước vòng lặp để xem tất cả các giá trị của $wp_queryđối tượng.


1
Điều này cũng không hoạt động. Nếu tôi in đối tượng $ wp_query ngay sau thẻ <body> tôi thấy rằng đối tượng bài đăng đầu tiên là mục blog chứ không phải chính trang đó. Tuy nhiên, cảm ơn vì mẹo print_r (). Tôi có thể tìm ra biến có thông tin mà tôi đang tìm kiếm (đặt thông tin này vào câu hỏi).
Bernard

lặp lại rằng $ page_title var đã làm việc cho tôi trong tiêu đề, cảm ơn.
Claire

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

Điều này làm việc cho tôi.

Nếu tôi hiểu chính xác, bạn muốn lấy tên trang trên một trang có bài đăng.


10

Bạn có thể lấy trang hiện tại, bài đăng hoặc loại bài đăng tùy chỉnh với biến toàn cục $post:

echo $post->post_title

Lưu ý: Trong một chức năng hoặc lớp, bạn sẽ cần chỉ định global $post;trước khi thử sử dụng $post.

Nếu bạn có các vòng lặp trên trang của mình, hãy đảm bảo bạn kết thúc mỗi vòng lặp wp_reset_postdata();để đặt $postlại về mục mặc định đang được hiển thị (trang).

Lưu ý, biến 'post_title' cũng có sẵn cho bất kỳ vòng lặp / truy vấn tùy chỉnh nào ... bao gồm các mục menu và tệp đính kèm phương tiện ... mọi thứ trong WordPress đều là 'bài đăng'.


Câu trả lời này là từ năm 2012, có kiến ​​thức nào về việc liệu phương pháp này có còn hoạt động với WP gần đây không?
Martin

1
Đúng, việc xử lý các loại bài đăng của WP WP sẽ không thay đổi
James

8

Nếu bạn đang tìm cách truy cập trang hiện tại từ trong tệp tin.php của mình (vì vậy, trước khi vòng lặp, trước $postđược điền, trước khi $wp_queryđược khởi tạo, v.v ...), bạn thực sự không có lựa chọn nào khác ngoài việc truy cập vào các biến máy chủ và trích xuất trang được yêu cầu từ chuỗi truy vấn.

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

Lưu ý rằng đây là một giải pháp "ngu ngốc". Chẳng hạn, chẳng hạn, trang có sên 'sắp ra mắt' cũng vậy p=6. Và nó giả định rằng các cài đặt permalink của bạn được đặt thành pagename(dù sao chúng cũng phải như vậy!).

Tuy nhiên, có thể là một mẹo nhỏ hữu ích nếu bạn có một kịch bản được kiểm soát. Tôi đang sử dụng điều này trong một tình huống mà tôi muốn chuyển hướng khách truy cập không đăng nhập đến trang "sắp ra mắt"; nhưng tôi phải đảm bảo rằng tôi sẽ không ném chúng vào "vòng lặp chuyển hướng" đáng sợ, vì vậy tôi cần loại trừ trang "sắp ra mắt" khỏi quy tắc này:

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

Tôi tin rằng chủ đề khởi động Roots có một chức năng tuyệt vời để có được tiêu đề trang hiện tại. Nó rất dễ hack, bao gồm tất cả các cơ sở, và có thể dễ dàng sử dụng với wp_titlehook.

/**
 * 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

Tôi đã đưa ra một giải pháp đơn giản hơn.

Lấy giá trị trả về của tên trang từ wp_title (). Nếu trống, in tên trang chủ, nếu không lặp lại giá trị wp_title ().

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

Nhớ xóa phân tách bằng đối số đầu tiên và sau đó đặt hiển thị thành false để sử dụng làm đầu vào cho biến. Sau đó, chỉ cần bung mã giữa các tiêu đề của bạn, vv thẻ.

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

Nó đã làm việc với tôi và đảm bảo rằng lần đầu tiên được khai báo trong phần mà bạn muốn trích xuất $title, điều này có thể được điều chỉnh để trả về các biến khác nhau.


5

Chúng ta chỉ cần sử dụng biến toàn cục "bài":

global $post;
echo $post->post_title;

Điều này sẽ lặp lại tiêu đề trang / bài hiện tại.


HTML GET thì sao?
Peter Mortensen

4

Sử dụng:

$title = get_the_title($post);
$parent_title = get_the_title($post->post_parent);

echo $title;
echo $parent_title;

Một lời giải thích sẽ theo thứ tự.
Peter Mortensen

3

Đây có vẻ là dễ sử dụng nhất:

<?php single_post_title(); ?>

1
Cuộc gọi này trả về tên bài đăng cuối cùng, không phải tên trang có chứa các bài đăng, ít nhất đó là những gì tôi hiểu từ tài liệu trực tuyến mà không cần kiểm tra nó.
Bernard

Điều này thật đúng với gì mà tôi đã tìm kiếm. Tôi đã tạo một tiêu đề mới cho trang của mình và điều này đã kéo tên của trang như mong đợi. Cảm ơn!
AJ Hernandez

3

Hiển thị tiêu đề trước khi vòng lặp bắt đầu:

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

2

Một tùy chọn, nếu bạn đang tìm kiếm trang được truy vấn thực tế, thay vì ID trang hoặc sên là để chặn truy vấn:

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

Trong chức năng của bạn, bạn có quyền truy cập vào đối tượng $ wp và bạn có thể lấy tên pagename hoặc tên bài đăng với:

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'];
     }
}

Mặt khác, nếu bạn thực sự cần dữ liệu bài đăng, thì nơi đầu tiên để có được nó (và được cho là trong bối cảnh này, tốt nhất) là:

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

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

Cuối cùng, tôi nhận ra đây có lẽ không phải là câu hỏi của OP, nhưng nếu bạn đang tìm kiếm tên trang Quản trị , hãy sử dụng toàn cầu $pagenow.


2

Trong Vòng lặp WordPress :

if ( have_posts() ) : while ( have_posts() ) : the_post();
/******************************************/
echo get_the_title();
/******************************************/
endwhile; endif;

Điều này sẽ cho bạn thấy tiêu đề trang hiện tại.

Để tham khảo: get_the_title ()


1

Đây là phiên bản của tôi:

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

get_query_var ('pagename') chỉ cho tôi sên trang. Vì vậy, ở trên thay thế tất cả các dấu gạch ngang, và làm cho chữ cái đầu tiên của mỗi chữ hoa - vì vậy nó thực sự có thể được sử dụng như một tiêu đề.


0

Đây là những gì tôi đã kết thúc sử dụng, kể từ năm 2018:

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

0

Bây giờ tôi đã tìm thấy chức năng này trên WordPress Codec ,

được yêu cầu

đó là một gói cho $wp_query->get_queried_object.

Bài đăng này đưa tôi đi đúng hướng, nhưng có vẻ như nó cần bản cập nhật này.


0

Điều này cũng hoạt động nếu bạn đang ở trong hàm.php. Nó không phải là cách tiếp cận tốt nhất vì bạn phải sử dụng mảng toàn cầu, nhưng nó hoạt động.

  1. Đầu tiên, chúng ta cần thêm một bộ lọc. Phải tồn tại một bộ lọc tốt hơn để sử dụng so với template_include, nhưng tôi không biết tất cả chúng. Hãy chỉ cho tôi một bên phải.

    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. Tránh sử dụng biến trực tiếp

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. Bây giờ bạn có thể sử dụng hàm get_current_page()trong bất kỳ phần nào khác của hàm.php.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.