Как получить ID записи произвольного типа из slug?

3 дек. 2015 г., 12:00:42
Просмотры: 87.4K
Голосов: 24

Возможно ли получить ID записи произвольного типа только по slug?

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

0
Все ответы на вопрос 3
0
67

Вы можете использовать get_page_by_path() - не дайте названию ввести вас в заблуждение, третий аргумент указывает тип записи:

if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
    $id = $post->ID;
else
    $id = 0;
3 дек. 2015 г. 12:51:49
2
13

Если вам нужно просто получить ID записи, это можно сделать одной строкой.

url_to_postid( site_url('the_slug') );
4 нояб. 2017 г. 00:31:49
Комментарии

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

Philipp Philipp
3 мар. 2018 г. 01:03:30

Хорошее решение, когда вы не уверены в типе записи.

gregdev gregdev
19 мар. 2022 г. 23:40:52
6

Если подождать пару дней и обновиться до 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 );
3 дек. 2015 г. 12:59:46
Комментарии

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

TheDeadMedic TheDeadMedic
3 дек. 2015 г. 14:36:11

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

Pieter Goosen Pieter Goosen
3 дек. 2015 г. 14:48:02

Круто :) Вау, для меня это действительно приятное обновление :)

stlawrance stlawrance
3 дек. 2015 г. 17:32:58

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

Pieter Goosen Pieter Goosen
3 дек. 2015 г. 19:10:42

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

TheDeadMedic TheDeadMedic
3 дек. 2015 г. 19:23:19

@TheDeadMedic Я имел в виду, что PHP выполняет меньше работы — да, конечно, полностью согласен. Просто всегда полезно знать альтернативы (хотя иногда они могут быть не самыми лучшими) и иметь какие-то ориентиры. Удачи ;-)

Pieter Goosen Pieter Goosen
3 дек. 2015 г. 19:34:13
Показать остальные 1 комментариев