Как получить пул текущей страницы?
Я пытаюсь извлечь slug текущей страницы wordpress за пределы цикла. Заголовок страницы возвращается с помощью wp_title ()
, но как я могу получить slug?
<li> <a href = "/slug-of-current-page /"> <? php wp_title ("", true); ? > & Lt; /а > & Lt; /& Li GT;
9 ответов
используйте глобальную переменную $ post
.
& л;? PHP
глобальные $ post;
$ Post_slug = $ пост- > POST_NAME;
? >
Как и в других ответах, slug хранится в свойстве post_name
. В то время как он мог получить доступ напрямую, я предпочитаю (недоиспользованный) get_post_field ()
функцию для свойств post post, у которых нет соответствующего API для них.
Он требует, чтобы сообщение было предоставлено явно и не было по умолчанию для текущего, поэтому в полном объеме для текущего сообщения это будет:
$ slug = get_post_field ('post_name', get_post ());
РЕДАКТИРОВАТЬ 5 АПРЕЛЯ 2016
После копания для большей надежности я закончил делать этот ответ на следующий пост, который приводит к этому редактированию : ( Обязательно проверьте )
Самый надежный метод до даты, который я мог придумать, следующий:
//Получить запрашиваемый объект и дезинфицировать его
$ current_page = sanitize_post ($ GLOBALS ['wp_the_query'] -> get_queried_object ());
//Получаем страницу
$ slug = $ current_page-> post_name;
Таким образом, вы 99.9999% уверены, что каждый раз получаете правильные данные.
ОРИГИНАЛЬНЫЙ ОТВЕТ
Другим более безопасным альтернативом этой проблеме является использование get_queried_object ()
, который содержит текущий запрошенный объект, чтобы получить slug-страницу, которая хранится в свойстве post_name
. Это можно использовать в любом месте вашего шаблона.
$ post
, но он может быть ненадежным, поскольку любой пользовательский запрос или настраиваемый код может изменить значение $ post
, поэтому его следует избегать за пределами петля.
Использование get_queried_object ()
, чтобы получить текущий объект страницы, намного надежнее и с меньшей вероятностью будет изменен, если вы не используете злой query_posts
, который разбивает основной объект запроса, но тогда это все зависит от вас.
Вы можете использовать приведенное выше, следуя
if (is_page ())
$ slug = get_queried_object () -> post_name;
Простой способ получить slug:
<? php echo basename (get_permalink ()); ? >
Учитывая пример кода, похоже, что вам действительно нужна ссылка. В этом случае вы можете использовать get_permalink () , который может использоваться вне цикла. Это должно делать то, что вам нужно более надежно, чем использование сообщения.
Возможно, это старый вопрос, но я создал функции get_the_slug () и the_slug () на основе ваших ответов.
if (! function_exists ("get_the_slug")) {
/**
* Возвращает страницу или сообщение.
*
* @param int | WP_Post | null $ id (необязательно) Почтовый индекс или пост-объект. По умолчанию используется глобальная почта.
* @return string
* /
function get_the_slug ($ id = null) {
$ post = get_post ($ id);
if (! empty ($ post)) return $ post-> post_name;
вернуть ''; //Нет доступных глобальных $ post var или совпадающих идентификаторов.
}
/**
* Показать страницу или добавить сообщение
*
* Использует get_the_slug () и применяет фильтр «the_slug».
*
* @param int | WP_Post | null $ id (необязательно) Почтовый индекс или пост-объект. По умолчанию используется глобальная почта.
* /
function the_slug ($ id = null) {
echo apply_filters ('the_slug', get_the_slug ($ id));
}
}
Еще раз на @Matthew Boynes ответьте, если вы заинтересованы в получении родительского slug (если есть), то я нашел эту функцию полезной:
function mytheme_get_slugs () {
if ($ link = get_permalink ()) {
$ link = str_replace (home_url ('/'), '', $ link);
if (($ len = strlen ($ link))> 0 &> $ link [$ len - 1] == '/') {
$ link = substr ($ link, 0, -1);
}
return explode ('/', $ link);
}
return false;
}
Например, чтобы добавить slug (s) в класс body:
function mytheme_body_class ($ classes) {
if ($ slugs = mytheme_get_slugs ()) {
$ classes = array_merge ($ classes, $ slugs);
}
return $ classes;
}
add_filter ('body_class', 'mytheme_body_class');
Динамическая страница, вызывающая в WordPress.
& л;? PHP
get_template_part ( 'имя_папка /' базовой (тегу get_permalink ()), 'имя'.);
? >
Если вы хотите получить более низкий ответ, вы можете использовать следующий SQL-запрос для получения всех сообщений, которые являются сообщениями, страницами или пользовательскими таксономиями в любое время, даже если никакие крючки не стреляли вообще, как еще.
Необработанный SQL:
SELECT `id`,` post_type` AS `type`,` post_author` AS `author`,` post_name` AS
`slug`,` post_status` AS `status`
FROM wp_posts
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
И `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;
Это работает даже в первой строке вашего файла функций, даже до mu_plugins_loaded
или init
.
@note
Предполагается, что у вас есть стандартный префикс базы данных wp_posts
. Если вам нужно учитывать префиксы переменных, вы можете легко получить правильную таблицу сообщений через PHP, выполнив следующие действия:
& л;? PHP
глобальный $ wpdb;
$ table = $ wpdb-> posts;
$ query = "SELECT` id`, `post_type` AS` type`, `post_author` AS` author`, `post_name` AS
`slug`,` post_status` AS `status`
FROM ". $ Table."
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
И `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;"
Затем запустите с помощью $ wpdb
, mysqli
или PDO
. Поскольку в этом запросе нет ввода пользователем, безопасно запускать без подготовленного оператора, если вы не вводите в него никаких переменных.
Я бы предложил сохранить это как частное статическое значение класса, поэтому его можно получить без необходимости повторного запроса запроса более одного раза на страницу для лучшей производительности, примерно так:
class Post_Cache
{
private static $ post_cache;
публичная функция __construct ()
{
//Этот путь пропускает операцию, если она уже установлена.
$ Этом- > initCache ();
}
public function get ($ id, $ type = null)
{
if (! (is_int ($ id) & & array_key_exists ($ id, self :: $ post_cache)))
return false;
}
if (! is_null ($ type))
{
//возвращает значение конкретного столбца для идентификатора
return self :: $ post_cache [$ id] [$ type];
}
//возвращает всю строку
return self :: $ post_cache [$ id];
}
частная функция initCache ()
{
if (is_null (self :: $ post_cache))
{
$ query = "...";
$ result = some_query_method ($ query); //Делаем вашу логику запроса здесь.
self :: $ post_cache = $ result;
{
}
}
Использование
$ cache = new \ Post_Cache ();
//Получаем страницу
$ slug = $ cache-> get (get_the_ID (), 'slug');
if ($ cache-> get (get_the_ID ()))
{
//сообщение существует
} else {
//нет, 404
}
if ($ cache-> get (get_the_ID (), 'status') === 'publish')
{
//это общедоступный
} else {
//либо проверяем current_user_can ('whatever_permission'), либо просто 404,
//зависит от того, хотите ли вы, чтобы он был видимым для текущего пользователя или нет.
}
if ($ cache-> get (get_the_ID (), 'type') === 'post')
{
//Это сообщение
}
if ($ cache-> get (get_the_ID (), 'type') === 'page')
{
//Это страница
}
Вы получаете суть. Если вам нужна дополнительная информация, вы можете получить их как обычно с помощью new \ WP_Post (get_the_ID ());
Это позволит вам проверять сообщения в любое время, даже если цикл wordpress не попал в точку, где он находит ваш запрос приемлемым. Это немного более оптимизированная версия того же запроса, выполняемого самим ядром Wordpress. Это отфильтровывает все нежелательные файлы, которые вы не хотите возвращать, и просто дает вам красиво организованный список с соответствующим идентификатором автора, типом сообщения, slug и видимостью. Если вам нужна дополнительная информация, вы можете получить их в обычном режиме с помощью new \ WP_Post ($ id);
или использовать любую из других встроенных функций Wordpress с любой из соответствующих строк таблицы, даже вне цикл.
Я использую подобную настройку в нескольких моих собственных настраиваемых темах и плагинах, и это работает очень хорошо. Это также безопасно и не оставляет внутренние данные, плавающие в глобальной области, где их можно переопределить, как и большинство вещей в Wordpress.