Як я можу отримати назву поточної сторінки в WordPress?


162

Який PHP-код можна використовувати для отримання поточної назви сторінки в темі WordPress?

Всі рішення , які я бачив до сих пір ( the_title(), get_page()->post_name, get_post()і т.д.) не працюють на сторінку , яка містить поштові записи. Усі вони повернуть назву останньої публікації в блозі.

Заявивши інший спосіб, припустимо, що у вас створена сторінка в WordPress з назвою "Мої новини". Ця сторінка встановлена ​​як "сторінка публікації". Додайте на сторінку пару публікацій. Тепер, який API можна використовувати для отримання рядка "мої новини" замість назви останньої публікації?


Я знайшов таку змінну, яка, здається, працює.

$wp_query->queried_object->post_name

Це власне URL-версія для назви сторінки (slug), яку я і шукав. Це було протестовано за шаблоном за замовчуванням ( двадцять десять ). Я дійсно не впевнений, чому дві змінні, наведені нижче, не працюють на моєму сайті. Завдяки кеч за print_r()наконечник .

Тепер, чому ця інформація прихована так глибоко?


для використання імені: single_post_title ('', false); для використання слизи: get_query_var ('ім'я сторінки');
jtmielczarek

Відповіді:


182

Глобальна змінна WordPress $pagenameповинна бути доступна для вас. Я щойно спробував із тією ж установкою, яку ви вказали.

$pagenameвизначається у файлі wp-include / theme.php, всередині функції get_page_template(), яка, звичайно, викликається до розбору файлів теми вашої сторінки, тому вона доступна в будь-якій точці ваших шаблонів для сторінок.

  • Хоча це, здається, не задокументоване, $pagename var встановлюється лише в тому випадку, якщо ви використовуєте постійні посилання. Я думаю, це тому, що якщо ви не користуєтесь ними, WordPress не потребує кулі сторінки, тому він не налаштовує її.

  • $pagename не встановлено, якщо ви використовуєте сторінку як статичну титульну сторінку.

    • Це код всередині /wp-includes/theme.php, який використовує рішення, на яке ви вказали, коли $pagename його неможливо встановити:

      $ pagename = get_query_var ('ім'я сторінки'); if (! $ pagename && $ id> 0) {// Якщо статична сторінка встановлена ​​як титульна сторінка, $ pagename не буде встановлено. Отримайте його з запитуваного об’єкта $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }


4
$ namename порожня при використанні всередині header.php. Я намагався використовувати шаблон за замовчуванням (двадцять) і використовувати його відразу після тегу <body>, але він не встановлений. До речі, жодна зі змінних query_vars не здається встановленою на цьому етапі.
Бернард

1
Я не бачу причин відсутності цієї змінної, можливо, я неправильно зрозумів вашу установку? Я зрозумів, що ви намагаєтеся зробити це всередині шаблону сторінки. Навіть якщо ви пишете "echo $ pagename" у першому рядку header.php, це повинно дати вам значення. З якою версією WP ви маєте справу?
AJJ

1
Ви можете спробувати трохи інший підхід, використовуючи get_query_var ("ім'я сторінки").
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-адресу, чи не так?
Бетті

24

Гаразд, ви повинні захопити заголовок сторінки перед циклом.

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

Перевірте посилання: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Зробіть a

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 року, чи є якісь відомості, чи цей метод все ще працюватиме з більш пізньою робочою програмою?
Мартін

1
Так, так - основна робота WP щодо типів публікацій не змінилася
Джеймс

8

Якщо ви хочете отримати доступ до поточної сторінки з вашого файлу function.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

Я вважаю, що тема Starter 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 (). Якщо порожнє, надрукуйте назву домашньої сторінки, інакше перегукуйтесь зі значенням 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
Цей дзвінок повертає прізвище останнього допису, а не ім’я сторінки, що містить повідомлення, принаймні, це я розумію в онлайн-документі без тестування.
Бернар

Це саме те, що я шукав. Я створив новий заголовок для своєї сторінки, і це потягнуло назву сторінки, як очікувалося. Дякую!
AJ Ернандес


2

Один із варіантів, якщо ви шукаєте фактично запитувану сторінку, а не ідентифікатор сторінки чи слизьку, - це перехоплення запиту:

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

Нарешті, я розумію, що це, ймовірно, не було питанням ОП, але якщо ви шукаєте ім'я сторінки адміністратора , використовуйте глобальний $pagenow.



1

Ось моя версія:

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

get_query_var ("ім'я сторінки") якраз давав мені кулі сторінки. Таким чином, вищезазначене замінює всі тире та робить першу букву кожного верхнього регістру слова - так воно фактично може використовуватися як заголовок.


0

Це те, що я закінчив, станом на 2018 рік:

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

0

Зараз я знайшов цю функцію в кодеку WordPress ,

отримати запит

який є обгорткою для $wp_query->get_queried_object .

Ця публікація спрямовувала мене в правильному напрямку, але, здається, вона потребує цього оновлення.


0

Це також працює, якщо ви перебуваєте у function.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. Тепер ви можете використовувати цю функцію get_current_page()в будь-якій іншій частині функції.php.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.