Как получить пользовательский тип записи из slug?

18

Можно ли получить пользовательский идентификатор поста только из slug?

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

stlawrance
источник

Ответы:

40

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

if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
    $id = $post->ID;
else
    $id = 0;
TheDeadMedic
источник
7

Если вы подождете пару дней и обновитесь до Wordpress 4.4, который выйдет 8 декабря ( AFAIK ), вы можете использовать новый post_name__inпараметр, WP_Queryкоторый принимает массив слагов

ПРИМЕР

Если вам нужен полный объект сообщения

$args = [
    'post_type'      => 'my_custom_post_type',
    'posts_per_page' => 1,
    'post_name__in'  => ['post-slug']
];
$q = get_posts( $args );
var_dump( $q );

Если вам нужен только идентификатор

$args = [
    'post_type'      => 'my_custom_post_type',
    'posts_per_page' => 1,
    'post_name__in'  => ['post-slug'],
    'fields'         => 'ids' 
];
$q = get_posts( $args );
var_dump( $q );
Питер Гусен
источник
Хорошо, но, вероятно, немного интенсивно, чтобы получить один пост слизняком? Почему они добавили эту функцию?
TheDeadMedic
1
@TheDeadMedic Могли бы быть немного интенсивным да, на самом деле не тестировали производительность на этом, просто добавили в качестве альтернативы ;-). Что касается того, почему, я действительно не знаю, похоже, что это одна из тех приятных вещей, которые так нужны, которыми так славится WordPress. Соглашение об именах, IMHO, также неверно, точно так же как post_nameсвойство и category_nameпараметр, которые должны были быть, slugа неname
Pieter Goosen
Хороший :) вау, на самом деле для меня его хорошее обновление :)
stlawrance
1
@TheDeadMedic Нет разницы во времени между моим методом и вашим методом. Я постоянно получаю от 0,002 до 0,005 секунд для выполнения каждого из наших запросов. Кроме того, оба метода запускают только 1 запрос. ;-)
Питер Гусен
1
@TheDeadMedic Я просто имел в виду, что PHP меньше работы - да, конечно, полностью согласен. Просто всегда приятно знать альтернативы ( хотя иногда они могут быть не самыми лучшими ) и иметь какие-то критерии. Наслаждайся ;-)
Питер Гусен
5

Если вам нужен только идентификатор сообщения, это поможет вам в одну строку.

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