Кнопка случайного поста

21-06-2010

Многие хотят поставить ссылку (кнопку) на случайный пост в сйдбаре, но не знают с чего начать. Сейчас я попытаюсь показать вам как это реализовать на WordPress.
Как наверное многие уже знают, WordPress хранит посты в базе данных MySQL. Чтобы получить URL случайного поста из базы данных, нам нужно составить запрос к MySQL базе. На самом деле это не так сложно как может казаться, спасибо WPDB, за класс базы данных который идет с WordPress, благодаря этому классу нам не надо беспокоится о имени базы, пароле, соединении с базой и т.д. Нам всего лишь нужно отправить запрос и получить результат.

MySQL запрос

Наш запрос к базе должен просмотреть таблицу постов и выбрать случайным образом один из опубликованных. Запрос будет выглядеть примерно так:

SELECT guid FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY RAND() LIMIT 1

Теперь пояcним:
1. SELECT guid выбираем значение столбца guide, которая содержит URL к текущему посту.
2. FROM wp_posts здесь указываем таблицу постов(в данном случае префикс wp_).
3. WHERE post_type=post так как вложения также сохраняются в таблице постов, мы должны указать что нам нужны только посты
4. AND post_status=publish выбираем только из опубликованных постов.
5. ORDER BY rand() упорядочиваем их в случайном порядке.
6. LIMIT 1 и выводим первый пост

PHP код

Теперь напишем PHP код. Как я уже говорил будем использовать WPDB класс, который встроен в WordPress. Это наш код:

$randomPost = $wpdb->get_var("SELECT guid FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY rand() LIMIT 1");
echo '<a href="'.$randomPost.'">Random Post</a>';

В первой строке кода, мы запускаем запрос используя WPDB функцию get_var(), и сохраняем результат в переменной $randomPost. Затем на следующей строке выводим ссылку, то есть мы создаем простую ссылку и вместо url записываем наш результат(случайный пост)
Отмечу в PHP коде я использовал $wpdb->posts вместо wp_posts. Так как wp_ это префикс который при установке мы можем и опустить или поменять, то есть не у всех такой префикс, $wpdb->posts выбирает нужную таблицу не зависит от префикса. Вот и все.

igoryanchikk4.8.2011 08:04
Буду знать.Спасибо автору.
Паради5.31.2011 01:05
Отличный пост! поставлю ссылку на вас...... У вас в RSS картинки не показывает......
Паради6.11.2011 06:06
Вы рекламу не продаете в блоге?... Почем у вас верхний баннер на сутки?...
Alexpts my-wordpress.ru10.23.2011 09:10
Более правильно делать такие вещи через API все же. Функцию query_post('orderby=rand&showposts=1') например. Это и более компактный код и можно не парится, что-то отвалится, т.к. через API работает
    dzantiev10.23.2011 09:10
    Да я знаю..., надо будет обновить пост. Спасибо
Dan2.6.2012 09:02
Не столько я благодарю вас за сам метод, сколько за дополнительные пояснения, почему выбрано то или другое. Мне много приходится копаться в коде плагинов и др. (без каких-то специальных знаний), поэтому о таких вещах, пусть и очевидных подсознательно, было приятно почитать :)
ОСТАВИТЬ КОММЕНТАРИЙ