Понимаю, что я уже немного подзадолбал прошаренных в WordPress читателей своего сайта публикацией постов для новичков. Что же, постараюсь в итоге найти в этом золотую середину.
В этом уроке рассмотрим 13 вариантов (да, целых 13!) получения айди постов в WordPress. Способы будут усложняться от самых простых в начале до самых хитрых в конце. Также в конце урока, теперь уже традиционно, вас ждёт его видео обзор.
post
, он нам и нужен!
То есть переходите в Записи или в Страницы, выбираете нужную и открываете её редактирование.
Можете прямо сейчас попробовать, если не знали об этом раньше. Для этого переходим в Настройки — Постоянные ссылки и там выбираем самую первую опцию — Простые.
После этого перейдите непосредственно на страницу какой-либо записи или страницы WordPress и вот что вы увидите. Это и есть ID записей и страниц.
Тут только важно обратить внимание, что для записей параметр будет называться p
, а для страниц page_id
.
Я не хочу дублировать один и тот же код со своих разных уроков, поэтому реализацию своей собственной колонки с ID постов вы найдёте по этой ссылке. Не беспокойтесь, там очень просто — достаточно скопировать готовый код в functions.php
текущей темы.
Так вот, когда вы её откроете, то сможете спокойно подсмотреть ID любой записи, любой страницы, да и вообще любого поста произвольного типа, если перейдёте в таблицу wp_posts (или вашпрефикс_posts, о том как и зачем менять префикс, читайте тут ).
В зависимости от ситуации, объект поста можно получить разными способами. Но так как в начале этого урока подразумевается, что мы не в курсе, какой ID искомой записи, то будем использовать именно глобальный объект:
global $post; echo $post->ID; // вывели ID текущей записи или страницы
Глобальный объект поста — это либо запись/страница, на которой вы находитесь, либо та, которая прокручивается в данный момент в цикле.
На самом деле этот пункт практически эквивалентен предыдущему. Суть в том, что, когда вы находитесь внутри страницы записи или внутри цикла, то можете смело получать или выводить ID текущего материала при помощи get_the_id() или the_id() соответственно.
Покажу как:
$misha_post = get_page_by_title( 'Привет, мир!', '', 'post' ); echo $misha_post->ID;
И сразу опробуем её в действии:
$misha_post = get_page_by_path('privet-mir', '', 'post'); echo $misha_post->ID;
Ну, и я думаю, не нужно лишний раз напоминать, что если хотите почитать больше о функции, просто переходите по этим ссылкам, я же не просто так их сюда вставляю.
Сразу выведу ID в примере:
echo url_to_postid( 'https://misha.agency/wordpress/kak-poluchit-id-posta.html' );
Тем не менее, если вы выставили тут какую-то страницу для отображения на главной:
То тогда вы можете вывести её ID в любом месте, где захотите, используя эту строчку кода:
echo get_option( 'page_on_front' );
То же самое кстати касается и страницы, которую вы выбрали в качестве Блога.
echo get_option( 'page_for_posts' );
Смотрите, мы создаём объект WP_Query и присваиваем его в переменную:
$x = new WP_Query( 'posts_per_page=-1' );
После этого все функции работы с циклом чудесным образом превращаются в методы этого объекта.
if( $x->have_posts() ) : // без WP_Query это просто have_posts() while( $x->have_posts() ) : $x->the_post(); // без WP_Query это просто функция the_post();
Так же и объект поста внутри цикла превращается из $post
в $x->post
, а значит ID поста будет выглядеть:
echo $x->post->ID;
Как только в этом разобраться, оно становится очень просто.
Не нашёл подобной функции в WordPress, поэтому решил соорудить её сам:
function truemisha_post_id_by_metas( $key, $value ){ global $wpdb; // получаем массив из всех ID, подходящих под заданные мета ключ и значение $all_posts = $wpdb->get_col( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value = %s", $key, $value ) ); // это уже необязательно, я просто сделал, что если ID найден только один, то он и возвращается в виде числа, // а если несколько постов удовлетворяют условию, то они и будут возвращены в виде массива if( count( $all_posts ) > 1 ) return $all_posts; // массив else return $all_posts[0]; // целое }
Конечно, если вы умеете строить SQL-запросы, то вы можете создать любую подобную функцию, но если нет, то вставляете её куда-нибудь в functions.php
и потом используете в любом месте темы.
echo truemisha_post_id_by_metas( 'post_views', 1000000 ); // а лучше не echo а print_r - ведь у нас там может быть массив
И ещё одна готовая функция для вас, очень похожа на функцию из предыдущего способа.
function truemisha_post_id_by_cat_tag( $cat_or_tag_id ){ global $wpdb; $all_posts = $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $cat_or_tag_id ) ); return $all_posts; }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Привет. Ищу инфу о ID в WP и увидела эту статью - уверенна автор и мне подскажет решение:)
У меня другая проблема с айдишками - приняла администрирование после предыдущего админа и о проблеме узнала соответственно - когда она "вылезла" :(
Есть Личный Кабинет ученика на WP. Учеников стало много и добавляться десятками за раз - и айди юзера стало совпадать с айди записи
(предыдущий админ просто наперед делал десяток записей, так как записей меньше чем юзеров, но мне сообщил это на днях только...)
Айди юзера, например, 5861 - и если есть записьс айди 5861, у которой присвоена своя метка для доступа - у юзера все ЕГО доступы(метки) пропадут.
Будут такие только метки, как у записи:(
Возможно есть готовые решения в таких случаях?
Привет, Ирин,
Мне нравится ваша уверенность, но я даже не понял вопрос 😁
Тут нужно смотреть код. Из описания совсем непонятно какую связь имеет ID записей и ID юзверов.
Не хватает инфы о том как получить ID страницы на которой выводятся циклом записи.
Проблема известная - цикл переопределяет значение ID в массиве и там хранится уже значение последней выведенной записи.
Кстати да, спасибо за идею!
Всю ночь ищу ответ на этот вопрос, так и не нашел. Помоги пожалуйста, как вывести id именно страницы с новостями, а не последней новости в цикле.
Если коротко, то в самом начале файла, до инициализации цикла, присвойте ID страницы в переменную, например
Подскажите если я в цикле вывожу посты и в разметке присутствуют например чекбоксы с атрибутами класса и имени - как сделать чтоб они выводились разными значениями автоматом
пока выкатываются с одинаковыми значениями атрибутов
например три поста в цыкле и уних одинаковые
class="cl1" name="name1"
class="cl1-<? the_ID() ?>" name="name1-<? the_ID() ?>"
Спасибо Миша за твою работу!!!!
Рад помочь! :)