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

Я пытаюсь извлечь slug текущей страницы wordpress за пределы цикла. Заголовок страницы возвращается с помощью wp_title (), но как я могу получить slug?

<li> <a href = "/slug-of-current-page /"> <? php wp_title ("", true); ? > & Lt; /а > & Lt; /& Li GT;
72 голоса | спросил sarytash 13 FebruaryEurope/MoscowbMon, 13 Feb 2012 08:25:46 +0400000000amMon, 13 Feb 2012 08:25:46 +040012 2012, 08:25:46

9 ответов


123

используйте глобальную переменную $ post.

& л;? PHP
    глобальные $ post;
    $ Post_slug = $ пост- > POST_NAME;
? >
ответил Arvind Pal 13 FebruaryEurope/MoscowbMon, 13 Feb 2012 10:27:21 +0400000000amMon, 13 Feb 2012 10:27:21 +040012 2012, 10:27:21
52

Как и в других ответах, slug хранится в свойстве post_name. В то время как он мог получить доступ напрямую, я предпочитаю (недоиспользованный) get_post_field () функцию для свойств post post, у которых нет соответствующего API для них.

Он требует, чтобы сообщение было предоставлено явно и не было по умолчанию для текущего, поэтому в полном объеме для текущего сообщения это будет:

$ slug = get_post_field ('post_name', get_post ());
ответил Rarst 21 Mayam15 2015, 00:10:06
23

РЕДАКТИРОВАТЬ 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;
ответил Pieter Goosen 21 Mayam15 2015, 10:00:26
9

Простой способ получить slug:

<? php echo basename (get_permalink ()); ? >
ответил tracey 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 25 Sep 2015 02:26:22 +0300 2015, 02:26:22
8

Учитывая пример кода, похоже, что вам действительно нужна ссылка. В этом случае вы можете использовать get_permalink () , который может использоваться вне цикла. Это должно делать то, что вам нужно более надежно, чем использование сообщения.

ответил Matthew Boynes 13 FebruaryEurope/MoscowbMon, 13 Feb 2012 08:55:40 +0400000000amMon, 13 Feb 2012 08:55:40 +040012 2012, 08:55:40
1

Возможно, это старый вопрос, но я создал функции 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));
    }
}
ответил Earlee 29 PM000000120000000131 2017, 12:09:01
0

Еще раз на @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');
ответил bonger 12 FebruaryEurope/MoscowbThu, 12 Feb 2015 19:33:31 +0300000000pmThu, 12 Feb 2015 19:33:31 +030015 2015, 19:33:31
0

Динамическая страница, вызывающая в WordPress.

& л;? PHP
    get_template_part ( 'имя_папка /' базовой (тегу get_permalink ()), 'имя'.);
    ? >
ответил Sujoy Bhowmick 14 FebruaryEurope/MoscowbTue, 14 Feb 2017 07:05:44 +0300000000amTue, 14 Feb 2017 07:05:44 +030017 2017, 07:05:44
0

Если вы хотите получить более низкий ответ, вы можете использовать следующий 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.

ответил mopsyd 23 MaramFri, 23 Mar 2018 04:43:49 +03002018-03-23T04:43:49+03:0004 2018, 04:43:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132