Как получить ID записи (страницы или CPT) по заголовку или ярлыку?
Я тщательно изучил Codex, не смог заставить работать get_page_by_title() и очень удивлен, что, похоже, нет стандартной функции WP для этой задачи.
Мне нужно получить ID любой записи/CPT или страницы, используя либо ярлык, либо заголовок записи/страницы. В идеале я ищу что-то вроде:
get_post_ID_by_title('Заголовок моей записи', 'customposttype');
Как мне это реализовать?

Обновление: Начиная с 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;
}

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

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

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

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

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

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

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

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

Вам не хватает параметра функции. Добавьте null в качестве второго необязательного параметра $output, и эта функция должна заработать.
get_page_by_title('Мой заголовок поста', null, 'customposttype');
Я только что столкнулся с той же проблемой, и добавление null решило её для меня.

Я стараюсь избегать прямых запросов к базе данных. Вместо этого я использую объект 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 поста. Вы также можете модифицировать функцию для возврата всего объекта поста, если это необходимо.

Это уже несколько лет, но данный вопрос все еще появляется в результатах поиска Google. Итак, вот простой способ сделать это:
$page = get_page_by_title( 'мой заголовок поста' );
или
$page = get_post_ID_by_title('мой заголовок поста', OBJECT, 'customposttype');
Затем просто используйте объект $page, чтобы получить ID:
$page->ID

В настоящее время (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);
// и т.д.
}
