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

145

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

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

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

Edit:

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

$wp_query->queried_object->post_name

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

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

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

19 ответов

172
Лучший ответ

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

$pagename определяется в файле wp-includes/theme.php внутри функции get_page_template(), который, конечно, вызывается до того, как ваши файлы темы страницы разобраны, поэтому он доступен в любой точке внутри ваших шаблонов для страницы.

EDIT:

  • Хотя он не задокументирован, $pagename var устанавливается только в том случае, если вы используете постоянные ссылки. Я предполагаю, что это связано с тем, что если вы не используете их, WP не нуждается в slug-странице, поэтому он не устанавливает его.

  • $pagename не устанавливается, если вы используете страницу как статическую переднюю страницу.

  • Это код внутри /wp -includes/theme.php, который использует решение, которое вы указали, когда $pagename не может быть установлен:

    $pagename = get_query_var('pagename');  
    if ( !$pagename && $id > 0 ) {  
        // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object  
        $post = $wp_query->get_queried_object();  
        $pagename = $post->post_name;  
    }
    
  • 4
    $ pagename пусто при использовании внутри header.php. Я попытался использовать шаблон по умолчанию (двадцатка) и использовать его сразу после тега <body>, но он не установлен. Кстати, ни одна из переменных query_vars, похоже, не установлена на этом этапе.
  • 1
    Я не вижу никакой причины отсутствия этой переменной, возможно, я неправильно понял вашу настройку? Я понял, что вы пытаетесь сделать это внутри шаблона страницы. Даже если вы напишите «echo $ pagename» в первой строке header.php, это должно дать вам значение. С какой версией WP вы имеете дело?
Показать ещё 8 комментариев
31

Мой подход, чтобы получить имя slug страницы

$slug = basename(get_permalink());
22

Хорошо, вы должны захватить заголовок страницы ПЕРЕД циклом.

$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 (). Я мог бы найти переменную, которая содержит информацию, которую я ищу (поместив эту информацию в вопросе).
  • 0
    повторяя, что $ page_title var работал для меня в шапке, спасибо.
17
<?php wp_title(''); ?>

Это сработало для меня, если я правильно понял, вы хотите получить имя страницы на странице с сообщениями в записи?

7

Вы можете получить текущую страницу, должность или персонализированный тип сообщения с глобальной переменной $post.

echo $post->post_title

Примечание. В функции или классе вам нужно указать global $post;, прежде чем пытаться использовать $post.

Если на вашей странице есть петли, убедитесь, что вы завершаете каждый цикл с помощью wp_reset_postdata();, чтобы установить $post обратно на отображаемый по умолчанию элемент (страница).

Примечание. Переменная 'post_title' также доступна для любого настраиваемого цикла/запроса, включая пункты меню и вложения в медиа. Все в WordPress является "сообщением".

6

Если вы хотите получить доступ к текущей странице из вашего файла 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' );
}
5

Нам просто нужно использовать глобальную переменную post.

global $post;
echo $post->post_title;

Это будет отражать текущий заголовок страницы/сообщения.

Надеюсь на эту помощь!!!!

  • 2
    Нет. Это возвращает первый пост на сайте, а не сам сайт ....
5

Я считаю, что тема Roots starter имеет фантастическую функцию для получения текущего заголовка страницы, очень взламываемая, охватывает все базы и может быть легко использована с помощью wp_title hook

https://github.com/roots/roots/blob/6.5.0/lib/titles.php.

/**
 * 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); ?>

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

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

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

[email protected]

5

Попробуйте следующее:

$pagename = get_query_var('pagename');
4

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

    echo $title;
    echo $parent_title;

Надеюсь, это поможет!;)

3

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

<?php single_post_title(); ?>
  • 0
    Этот вызов возвращает имя последнего сообщения, а не имя страницы, которая содержит сообщения, по крайней мере, это то, что я понимаю из онлайн-документа без его тестирования.
  • 0
    Это именно то, что я искал. Я сделал новый заголовок для своей страницы и вытащил название страницы, как и ожидалось. Спасибо!
2

Внутри цикла

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

Это покажет вам текущий заголовок страницы. Для рефренса http://codex.wordpress.org/Function_Reference/get_the_title

1

Показывать заголовок до начала цикла:

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

Спасибо

1

Здесь моя версия:

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

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

1

Один из вариантов, если вы ищете фактическую запрашиваемую страницу, а не идентификатор страницы или slug, - это перехват запроса:

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, но если вы ищете имя страницы Admin, используйте глобальный $pagenow.

0

Это то, что я использовал, начиная с 2018 года:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
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() в любой другой части функции .php.

0

Теперь я нашел в Wordpress Codec эту функцию:

получить запрос http://codex.wordpress.org/Function_Reference/wp_list_pages

который является оберткой для $wp_query->get_queried_object. Это сообщение поставило меня в правильном направлении, но кажется, что оно нуждается в этом обновлении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню