Какой 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()
.
Теперь, почему эта информация скрыта настолько глубоко?
Глобальная переменная 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;
}
Мой подход, чтобы получить имя slug страницы
$slug = basename(get_permalink());
Хорошо, вы должны захватить заголовок страницы ПЕРЕД циклом.
$page_title = $wp_query->post->post_title;
Проверьте ссылку: http://codex.wordpress.org/Function_Reference/WP_Query#Properties.
Сделайте
print_r($wp_query)
перед циклом, чтобы увидеть все значения объекта $wp_query
<?php wp_title(''); ?>
Это сработало для меня, если я правильно понял, вы хотите получить имя страницы на странице с сообщениями в записи?
Вы можете получить текущую страницу, должность или персонализированный тип сообщения с глобальной переменной $post.
echo $post->post_title
Примечание. В функции или классе вам нужно указать global $post;
, прежде чем пытаться использовать $post.
Если на вашей странице есть петли, убедитесь, что вы завершаете каждый цикл с помощью wp_reset_postdata();
, чтобы установить $post обратно на отображаемый по умолчанию элемент (страница).
Примечание. Переменная 'post_title' также доступна для любого настраиваемого цикла/запроса, включая пункты меню и вложения в медиа. Все в WordPress является "сообщением".
Если вы хотите получить доступ к текущей странице из вашего файла 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' );
}
Нам просто нужно использовать глобальную переменную post.
global $post;
echo $post->post_title;
Это будет отражать текущий заголовок страницы/сообщения.
Надеюсь на эту помощь!!!!
Я считаю, что тема 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();
}
}
Я придумал более простое решение.
Получите возвращаемое значение имени страницы из wp_title(), если пусто, напечатайте имя главной страницы, иначе echo значение wp_title.
<?php $title = wp_title('',false); ?>
Не забудьте удалить разделение с первым аргументом, а затем установить отображение в false для использования в качестве ввода переменной. затем просто надавите код между тегами заголовка и т.д.
<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>
Работала для меня и гарантировала, что первое объявлено в разделе, где вы хотите извлечь $title, это может быть настроено для возврата разных переменных.
Попробуйте следующее:
$pagename = get_query_var('pagename');
$title = get_the_title($post); $parent_title = get_the_title($post->post_parent); echo $title; echo $parent_title;
Надеюсь, это поможет!;)
Я знаю, что это старо, но я натолкнулся на это, и, как представляется, это самый простой способ использовать это.
<?php single_post_title(); ?>
Внутри цикла
<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
Показывать заголовок до начала цикла:
$page_title = $wp_query->post->post_title;
Спасибо
Здесь моя версия:
$title =ucwords(str_replace('-', ' ', get_query_var('pagename')));
get_query_var ('pagename') просто дал мне страницу. Таким образом, вышеупомянутое заменяет все тире и делает первую букву каждого слова в верхнем регистре - поэтому ее можно фактически использовать как заголовок.
Один из вариантов, если вы ищете фактическую запрашиваемую страницу, а не идентификатор страницы или 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
.
Это то, что я использовал, начиная с 2018 года:
<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
Это также работает, если вы находитесь в функции 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.
Теперь я нашел в Wordpress Codec
эту функцию:
получить запрос http://codex.wordpress.org/Function_Reference/wp_list_pages
который является оберткой для $wp_query->get_queried_object
. Это сообщение поставило меня в правильном направлении, но кажется, что оно нуждается в этом обновлении.