Как я могу получить имя текущей страницы в WordPress?


163

Какой код PHP можно использовать для получения имени текущей страницы в теме WordPress?

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

Другими словами, предположим, что у вас есть страница, созданная в WordPress с именем «Мои новости». Эта страница установлена ​​как «страница поста». Добавьте пару постов на страницу. Теперь, какой API можно использовать для получения строки «my-news» вместо названия последнего сообщения?


Я нашел следующую переменную, которая, кажется, работает.

$wp_query->queried_object->post_name

На самом деле это дружественная к URL версия названия страницы (slug), что я тоже искал. Это было проверено с шаблоном по умолчанию ( Twenty Ten ). Я действительно не уверен, почему две переменные, указанные ниже, не работают на моем сайте. Спасибо keatch за print_r()отзыв .

Теперь, почему эта информация так глубоко спрятана?


для имени используйте: single_post_title ('', false); для использования слага: get_query_var ('pagename');
jtmielczarek

Ответы:


183

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

$pagenameопределяется в файле wp-includes / 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, не так ли?
Бетти

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?
Мартин

1
Да, это так - основная обработка типов записей в WP не изменилась
Джеймс

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 (). Если пусто, напечатайте имя домашней страницы, в противном случае выведите значение wp_title ().

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

Не забудьте удалить разделение с помощью первого аргумента, а затем установить для отображения значение false, чтобы использовать его в качестве входных данных для переменной. Затем просто вставьте код между тегами заголовка и т. Д.

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

Это сработало для меня и гарантировало, что первое объявлено в разделе, где вы хотите извлечь $title, это может быть настроено для возврата различных переменных.




3

Это кажется самым простым в использовании:

<?php single_post_title(); ?>

1
Этот вызов возвращает имя последнего сообщения, а не имя страницы, которая содержит сообщения, по крайней мере, это я так понимаю из онлайн-документа, не проверяя его.
Бернард

Это именно то, что я искал. Я сделал новый заголовок для своей страницы и вытащил название страницы, как и ожидалось. Спасибо!
Эй Джей Эрнандес


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.


2

В WordPress Loop :

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

Вот что я использовал в 2018 году:

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

0

Теперь я нашел эту функцию на кодеке WordPress ,

получить запрос

который является оберткой для $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. Теперь вы можете использовать функцию get_current_page()в любой другой части functions.php.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.