Как получить ID записи (страницы или CPT) по заголовку или ярлыку?

6 мар. 2011 г., 12:35:38
Просмотры: 26.5K
Голосов: 7

Я тщательно изучил Codex, не смог заставить работать get_page_by_title() и очень удивлен, что, похоже, нет стандартной функции WP для этой задачи.

Мне нужно получить ID любой записи/CPT или страницы, используя либо ярлык, либо заголовок записи/страницы. В идеале я ищу что-то вроде:

get_post_ID_by_title('Заголовок моей записи', 'customposttype');

Как мне это реализовать?

3
Комментарии

Как вы использовали get_page_by_title и является ли пользовательский тип записи иерархическим? Я не думаю, что get_page (вызываемый через get_page_by_title) будет работать для неиерархических типов.

t31os t31os
6 мар. 2011 г. 13:00:16

Да, рассматриваемый пользовательский тип записи не является иерархическим.

jnthnclrk jnthnclrk
6 мар. 2011 г. 13:15:03

Игнорируйте предыдущий комментарий про иерархичность — это не должно иметь значения. Как именно вы вызывали get_page_by_title?

t31os t31os
7 мар. 2011 г. 01:27:38
Все ответы на вопрос 5
10
13

Обновление: Начиная с WordPress 3.0 вы можете использовать встроенную функцию get_page_by_title с третьим параметром $post_type:

$post = get_page_by_title( 'Название записи', OBJECT, 'post_type' );

$post_id = $post ? $post->ID : 0;

Оригинальный ответ

Вы можете использовать эту функцию, найденную через Google по запросу "get post by title"

/**
* Получение записи по её заголовку.
*
* @uses $wpdb
*
* @param string $post_title Заголовок записи
* @param string $post_type Тип записи ('post','page','любой произвольный тип')
* @param string $output Необязательно. Тип вывода. OBJECT, ARRAY_N или ARRAY_A.
* @return mixed
*/
function get_post_by_title($page_title, $post_type ='post' , $output = OBJECT) {
    global $wpdb;
        $post = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type= %s", $page_title, $post_type));
        if ( $post )
            return get_post($post, $output);
 
    return null;
}
6 мар. 2011 г. 13:01:14
Комментарии

Пока мне удавалось избегать использования SQL-запросов, так как я предпочитаю стандартные функции WordPress. Действительно ли это единственный способ достичь того, что мне нужно?

jnthnclrk jnthnclrk
6 мар. 2011 г. 13:14:07

Данный код практически является прямой копией функции get_page_by_title функции, основное отличие в том, что он будет работать с неиерархическими типами записей, поэтому его стоит добавить в свою коллекцию функций.

t31os t31os
6 мар. 2011 г. 13:25:20

@t31os Я не утверждал, что это мой код, я лишь добавил параметр $post_type, и да, он определенно пополнит мою коллекцию.

Bainternet Bainternet
6 мар. 2011 г. 13:45:12

Я ни в чем тебя не обвиняю, приятель, скорее наоборот — поддерживаю твой ответ.. ;) Ты уже получил мой +1.. :)

t31os t31os
6 мар. 2011 г. 14:13:06

@t31os Я знаю, это просто неудачная шутка :)

Bainternet Bainternet
6 мар. 2011 г. 14:29:06

Чем это отличается от нативной get_page_by_title()?.. get_page() — это практически алиас для get_post(), не вижу, как это изменение что-то меняет.

Rarst Rarst
6 мар. 2011 г. 21:50:17

@Rarst Теперь, когда ты обратил на это внимание, я вижу, что функции идентичны и не могу найти различий.

Bainternet Bainternet
6 мар. 2011 г. 21:57:58

@t31os так где же проявляется упомянутая тобой *неиерархическая* особенность, если функции по сути одинаковы?..

Rarst Rarst
6 мар. 2011 г. 22:09:09

Не знаю, о чём я думал утром, get_page вызывает get_post в любом случае, и я не понимаю, почему решил, что get_page работает только с иерархическими типами записей, похоже это не так.

t31os t31os
7 мар. 2011 г. 01:26:35

Это можно легко сделать с помощью объекта страницы. Смотрите мой ответ ниже.

Phill Healey Phill Healey
30 июл. 2017 г. 02:03:37
Показать остальные 5 комментариев
1

Вам не хватает параметра функции. Добавьте null в качестве второго необязательного параметра $output, и эта функция должна заработать.

get_page_by_title('Мой заголовок поста', null, 'customposttype');

Я только что столкнулся с той же проблемой, и добавление null решило её для меня.

17 июн. 2011 г. 20:30:33
Комментарии

Этот null действительно должен быть OBJECT для ясности. Но да, по сути он передавал тип записи как тип вывода, опуская указание типа вывода.

Phill Healey Phill Healey
30 июл. 2017 г. 02:05:21
1

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

Вот функция, которую я использую в одной из своих тем для получения ID поста по его слагу (slug):

function get_post_id( $slug, $post_type ) {
    $query = new WP_Query(
        array(
            'name' => $slug,
            'post_type' => $post_type
        )
    );

    $query->the_post();

    return get_the_ID();
}

Эта функция создает запрос через WP API для получения поста определенного типа с указанным слагом, запускает стандартные функции цикла для результата и возвращает ID поста. Вы также можете модифицировать функцию для возврата всего объекта поста, если это необходимо.

17 июн. 2011 г. 20:44:52
Комментарии

Вместо $query->the_post(), который изменяет цикл и может нарушить работу любых функций get_the_xxx после него, лучше использовать:

if ($query->have_posts())
 {
  return $query->posts[0]->ID;
 }
 else
 {
  return 0;
 }
Mikepote Mikepote
14 дек. 2015 г. 15:07:11
0

Это уже несколько лет, но данный вопрос все еще появляется в результатах поиска Google. Итак, вот простой способ сделать это:

$page = get_page_by_title( 'мой заголовок поста' );

или

$page = get_post_ID_by_title('мой заголовок поста', OBJECT, 'customposttype');

Затем просто используйте объект $page, чтобы получить ID:

$page->ID
30 июл. 2017 г. 02:02:45
0

В настоящее время (WP >4.9.2) вы можете найти любую запись/страницу и т.д. по заголовку/ярлыку (slug) следующим образом:

$page = get_posts(
    array(
        //'name'      => 'your-post-slug', // по ярлыку записи
        'title'      => 'Your post title', // по заголовку записи
        'post_type' => 'page' // нужный тип записи
    )
);

if ($page = $page[0]) // Если найдено несколько объектов, берется первый/с наименьшим ID
{
    // Затем выполняете необходимые действия...
    // $id = $page->id;
    // $content = $page->post_content;
    // или $content = apply_filters('the_content', $page->post_content);
    // и т.д.
}
3 февр. 2018 г. 23:59:07