Как получить ID записи произвольного типа из slug?
Возможно ли получить ID записи произвольного типа только по slug?
Насколько я знаю, мы можем получить ID по заголовку. Но в произвольном типе записей могут быть одинаковые заголовки, а поскольку slug уникальны - возможно ли это???

Вы можете использовать get_page_by_path()
- не дайте названию ввести вас в заблуждение, третий аргумент указывает тип записи:
if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
$id = $post->ID;
else
$id = 0;

Функция url_to_postid
очень гибкая: вы можете передать любой вид постоянной ссылки/полного URL и получить наиболее точный идентификатор записи для этого URL. Однако из-за гибкости использования она довольно медленная (особенно при большом количестве конечных точек/типов записей).
Если вы передаете только ярлык для определенного типа записи, гораздо быстрее использовать get_page_by_path()

Если подождать пару дней и обновиться до WordPress 4.4, который выйдет 8 декабря (насколько мне известно), можно будет использовать новый параметр post_name__in
в WP_Query
, который принимает массив слагов (названий записей в URL).
ПРИМЕР
Если нужен полный объект записи
$args = [
'post_type' => 'my_custom_post_type', // тип записи
'posts_per_page' => 1, // количество записей
'post_name__in' => ['post-slug'] // массив слагов
];
$q = get_posts( $args );
var_dump( $q );
Если нужен только ID записи
$args = [
'post_type' => 'my_custom_post_type', // тип записи
'posts_per_page' => 1, // количество записей
'post_name__in' => ['post-slug'], // массив слагов
'fields' => 'ids' // возвращать только ID
];
$q = get_posts( $args );
var_dump( $q );

Круто, но, возможно, немного ресурсоемко для получения одной записи по слагу? Зачем они добавили эту функцию!?

@TheDeadMedic Да, может быть немного ресурсоемко, я не тестировал производительность, просто добавил как альтернативу ;-). А зачем — я действительно не знаю, похоже на одну из тех ненужных "приятных мелочей", которыми славится WordPress. Конвенция именования, ИМХО, тоже неправильная, как и свойство post_name
и параметр category_name
, которые должны были быть slug
, а не name
.

@TheDeadMedic Нет разницы во времени между моим методом и вашим. Я постоянно получаю от 0,002 до 0,005 секунд на выполнение каждого из наших запросов. Кроме того, оба метода выполняют только 1 запрос. ;-)

Когда я сказал, что get_page_by_path
работает эффективнее, я имел в виду, что PHP выполняет меньше работы (немного обработки аргументов и SQL-запрос) по сравнению с WP_Query
(который включает множественные создания объектов и проход через множество фильтров/действий/аргументов). Фактическое время выполнения редко показывает разницу, если мы не симулируем тысячи операций. Но полезно знать, что в реальном мире это в конечном итоге не имеет значения ;)
