ฉันจะรับชื่อหน้าปัจจุบันใน WordPress ได้อย่างไร


162

รหัส PHP ใดที่สามารถใช้เพื่อเรียกชื่อหน้าปัจจุบันในธีม WordPress?

การแก้ปัญหาทั้งหมดที่ฉันได้เห็นเพื่อให้ห่างไกล ( the_title(), get_page()->post_name, get_post()ฯลฯ ) จะไม่ได้ทำงานสำหรับหน้าเว็บที่มีรายการโพสต์ พวกเขาทั้งหมดจะส่งคืนชื่อของรายการบล็อกล่าสุด

ระบุอีกวิธีหนึ่งสมมติว่าคุณมีหน้าเว็บที่สร้างขึ้นใน WordPress ด้วยชื่อ "My News" หน้านี้ถูกตั้งค่าเป็น "หน้าโพสต์" เพิ่มสองสามโพสต์ในหน้า ตอนนี้ API ใดที่สามารถใช้เพื่อดึงสตริง "my-news" แทนที่จะเป็นชื่อโพสต์ล่าสุด


ฉันพบตัวแปรต่อไปนี้ซึ่งดูเหมือนว่าจะใช้งานได้

$wp_query->queried_object->post_name

อันที่จริงแล้วเป็นชื่อ URL ของหน้าเว็บ (กระสุน) ซึ่งเป็นสิ่งที่ฉันต้องการเช่นกัน นี่คือการทดสอบกับแม่แบบเริ่มต้น ( ยี่สิบสิบ ) ฉันไม่แน่ใจจริงๆว่าทำไมตัวแปรทั้งสองที่ระบุด้านล่างไม่ทำงานบนเว็บไซต์ของฉัน ขอขอบคุณที่keatchสำหรับprint_r()เคล็ดลับ

ทีนี้ทำไมข้อมูลนี้จึงถูกซ่อนลึก?


สำหรับการใช้ชื่อ: single_post_title ('', false); สำหรับการใช้งานกระสุน: get_query_var ('pagename');
jtmielczarek

คำตอบ:


182

ตัวแปรทั่วโลกของ WordPress $pagenameควรจะมีให้สำหรับคุณ ฉันเพิ่งลองตั้งค่าเดียวกับที่คุณระบุ

$pagenameถูกกำหนดไว้ในไฟล์ wp-include / theme.php ภายในฟังก์ชั่นget_page_template()ซึ่งแน่นอนว่าเรียกว่าก่อนที่ไฟล์ธีมของหน้าของคุณจะถูกแยกวิเคราะห์ดังนั้นจึงสามารถใช้ได้ทุกจุดในเทมเพลตสำหรับหน้า

  • แม้ว่าจะไม่ปรากฏเป็นเอกสาร แต่$pagenameก็มีการตั้งค่าไว้เฉพาะเมื่อคุณใช้ลิงก์ถาวร ฉันเดาว่านี่เป็นเพราะถ้าคุณไม่ใช้ 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
$ pagename ว่างเปล่าเมื่อใช้ภายใน header.php ฉันได้ลองใช้เทมเพลตเริ่มต้น (ยี่สิบ) และใช้งานทันทีหลังจากแท็ก <body> แต่ไม่ได้ตั้งค่า อนึ่งดูเหมือนว่าจะไม่มีการตั้งค่าตัวแปร query_vars ในขั้นตอนนั้น
เบอร์นาร์ด

1
ฉันไม่เห็นเหตุผลที่ไม่มีตัวแปรนั้นบางทีฉันอาจเข้าใจผิดเกี่ยวกับการตั้งค่าของคุณหรือไม่ ฉันเข้าใจว่าคุณกำลังพยายามทำสิ่งนี้ภายในเทมเพลตหน้า แม้ว่าคุณจะเขียน "echo $ pagename" ในบรรทัดแรกของ header.php มันควรจะให้คุณค่าแก่คุณ คุณกำลังจัดการกับ WP รุ่นใด
AJJ

1
คุณสามารถลองใช้วิธีที่แตกต่างกันเล็กน้อยโดยใช้ get_query_var ('pagename')
AJJ

@AJweb: ใช่สำหรับเทมเพลตที่ฉันกำลังสร้าง แต่ฉันใช้เทมเพลตเริ่มต้นสำหรับการทดสอบอยู่ภายใน header.php ฉันได้รับความประทับใจว่าคุณยังไม่ได้ทดสอบโซลูชันของคุณ คุณเห็นชื่อหน้าเมื่อคุณใส่ <h1> <? php echo $ pagename?> </h1> หลังจากแท็ก <body> ใน header.php หรือไม่
เบอร์นาร์ด

1
นี้ได้เคล็ดลับสำหรับฉัน: $pagename = $wp_query->queried_object->post_name;เพียงไม่ลืมที่จะตั้งglobal $wp_query;มาก่อน!
ซาราน

39

วิธีการของฉันเพื่อรับชื่อกระสุนของหน้า:

$slug = basename(get_permalink());

ใช้งานได้ก็ต่อเมื่อพวกเขาใช้ url ที่สวยใช่มั้ย
Betty

24

ตกลงคุณต้องคว้าชื่อหน้าก่อนวนซ้ำ

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

ตรวจสอบการอ้างอิง: http://codex.wordpress.org/Function_Reference/WP_Query#Properties

ทำ

print_r($wp_query)

ก่อนที่วงจะเห็นค่าทั้งหมดของ$wp_queryวัตถุ


1
มันไม่ทำงานเหมือนกัน ถ้าฉันพิมพ์ $ wp_query วัตถุหลังจากแท็ก <body> ฉันเห็นว่าวัตถุที่โพสต์แรกคือรายการบล็อกไม่ใช่หน้าตัวเอง อย่างไรก็ตามขอบคุณสำหรับเคล็ดลับ print_r () ฉันสามารถหาตัวแปรที่มีข้อมูลที่ฉันกำลังมองหา (ใส่ข้อมูลนี้ในคำถาม)
เบอร์นาร์ด

สะท้อนออกมาว่า $ page_title var ใช้ได้สำหรับฉันในส่วนหัวขอบคุณ
แคลร์

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

สิ่งนี้ใช้ได้สำหรับฉัน

หากฉันเข้าใจถูกต้องคุณต้องการรับชื่อหน้าในหน้าเว็บที่มีรายการโพสต์


10

คุณสามารถรับหน้าปัจจุบันโพสต์หรือประเภทโพสต์ที่กำหนดเองด้วยตัวแปรทั่วโลก$post:

echo $post->post_title

หมายเหตุ: ในฟังก์ชั่นหรือระดับที่คุณจะต้องระบุก่อนที่จะพยายามที่จะใช้global $post;$post

หากคุณมีลูปบนหน้าของคุณตรวจสอบให้แน่ใจว่าคุณจบแต่ละลูปด้วยwp_reset_postdata();เพื่อตั้งค่า$postกลับเป็นไอเท็มเริ่มต้นที่จะแสดง (หน้า)

หมายเหตุตัวแปร 'post_title' ยังมีให้สำหรับลูป / แบบสอบถามที่กำหนดเอง ... รวมถึงรายการเมนูและสิ่งที่แนบสื่อ ... ทุกอย่างใน WordPress คือ 'โพสต์'


คำตอบนี้มาจาก 2012 มีความรู้เกี่ยวกับวิธีการนี้ว่าจะยังคงทำงานกับ WP ที่ใหม่กว่านี้หรือไม่?
Martin

1
ถ้าเป็นเช่นนั้น - การจัดการโพสต์หลักของ WP จะไม่เปลี่ยนแปลง
James

8

หากคุณต้องการเข้าถึงหน้าปัจจุบันจากในไฟล์ functions.php ของคุณ (เช่นก่อนลูปก่อนที่จะ$postถูกเติมข้อมูลก่อน$wp_queryจะเริ่มต้น ฯลฯ ) คุณไม่มีทางเลือกนอกจากเข้าถึงตัวแปรเซิร์ฟเวอร์เองและ คลายบีบอัดหน้าที่ร้องขอจากสตริงการสืบค้น

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

โปรดทราบว่านี่เป็นวิธี "โง่" ไม่ทราบตัวอย่างเช่นหน้าเว็บที่มีกระสุน 'กำลังจะมาถึงเร็ว ๆ นี้' ก็เช่นp=6กัน และถือว่าการตั้งค่าลิงก์ถาวรของคุณถูกตั้งค่าเป็น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มีฟังก์ชั่นที่ยอดเยี่ยมในการรับชื่อหน้าปัจจุบัน มันแฮ็คได้มากครอบคลุมฐานทั้งหมดและสามารถใช้กับ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 () ถ้าว่างเปล่าให้พิมพ์ชื่อโฮมเพจมิฉะนั้น echo ค่า wp_title ()

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

อย่าลืมลบการแยกด้วยอาร์กิวเมนต์แรกจากนั้นตั้งค่าการแสดงผลเป็นเท็จเพื่อใช้เป็นอินพุตไปยังตัวแปร จากนั้นเพียงแค่กดรหัสระหว่างหัวเรื่องและแท็กอื่น ๆ

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

มันทำงานได้ดีสำหรับฉันและทำให้มั่นใจว่าสิ่งแรกที่ถูกประกาศในส่วนที่คุณต้องการแยก$titleมันสามารถปรับได้เพื่อคืนค่าตัวแปรต่าง ๆ


5

เราแค่ต้องใช้ตัวแปรโกลบอล "โพสต์":

global $post;
echo $post->post_title;

สิ่งนี้จะสะท้อนชื่อหน้า / โพสต์ปัจจุบัน


แล้ว HTML GETล่ะ
Peter Mortensen


3

นี่เป็นวิธีที่ง่ายที่สุดในการใช้:

<?php single_post_title(); ?>

1
การโทรนี้ส่งคืนชื่อโพสต์สุดท้ายไม่ใช่ชื่อเพจที่มีโพสต์อย่างน้อยนั่นคือสิ่งที่ฉันเข้าใจจากเอกสารออนไลน์โดยไม่ต้องทดสอบ
เบอร์นาร์ด

นี่คือสิ่งที่ฉันกำลังมองหา ฉันสร้างส่วนหัวใหม่สำหรับหน้าของฉันและนี่เป็นการดึงชื่อของหน้าตามที่คาดไว้ ขอบคุณ!
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 แต่ถ้าคุณกำลังมองหางานธุรการ$pagenowชื่อเพจใช้ทั่วโลก


2

ภายในลูป WordPress :

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

นี่จะแสดงชื่อหน้าปัจจุบัน

สำหรับการอ้างอิง: get_the_title ()


1

นี่คือรุ่นของฉัน:

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

get_query_var ('pagename') เป็นเพียงแค่ให้กระสุนหน้าฉัน ดังนั้นข้างต้นแทนที่เครื่องหมายขีดคั่นทั้งหมดและทำให้ตัวอักษรตัวแรกของแต่ละคำเป็นตัวพิมพ์ใหญ่ - ดังนั้นจึงสามารถใช้เป็นชื่อเรื่องได้


0

นี่คือสิ่งที่ฉันลงเอยด้วยการใช้ในปีพ. ศ. 2561:

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

0

ตอนนี้ฉันได้พบกับฟังก์ชั่นนี้บนWordPress Codecแล้ว

ถูกสอบถาม

$wp_query->get_queried_objectซึ่งเป็นเสื้อคลุมสำหรับ

โพสต์นี้ทำให้ฉันไปในทิศทางที่ถูกต้อง แต่ดูเหมือนว่ามันต้องการการอัปเดตนี้


0

สิ่งนี้ยังใช้งานได้หากคุณอยู่ใน ไม่ใช่วิธีที่ดีที่สุดเนื่องจากคุณต้องใช้อาร์เรย์ทั่วโลก แต่ใช้งานได้

  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. ตอนนี้คุณสามารถใช้ฟังก์ชั่นget_current_page()ในส่วนอื่น ๆ ของ functions.php

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.