2007
Как публиковать отдельно от основной ленты выбираемый в админке пост
Закончил на днях разработку очередного сайта на движке WordPress - можно сказать новостного портала. В процессе работы возникла одна нелегкая задача, суть которой заключалась в следующем:
1) на сайте должен присутствовать блок "Новость дня", в котором будет выводиться новость по выбору администратора;
2) необходима возможность каким-то образом прямо в админке помечать нужную новость, как "избранную" (вариант, когда используется query_posts, в данном случае не подходит, поскольку "новость дня" будет определяться очень часто, а редактировать для этого шаблон, чтобы каждый раз указывать новый ID поста, весьма неудобно; идеальный вариант - когда можно пометить новость в момент ее написания/редактирования);
3) важно, чтобы при этом новость не выпадала из основной ленты новостей, т.е. одновременно присутствовала и в общей ленте, и в отдельном блоке;
4) желательно, чтобы для решения задачи можно было воспользоваться готовыми решениями/плагинами без необходимости что-либо программировать;
5) плюсом также будет и простота в настройке.
Как я представлял себе это решение своим непрограммерским взглядом - в админке нужный пост помечается специальной меткой, а в шаблоне используется какая-то функция, которая находит пост по этой метке в базе данных и выводит его на страницу.
Мое внимание в этом отношении привлекли 2 плагина:
1) AdHesive - позволяет закрепить запись в ленте выше всех остальных, независимо от даты ее написания.
2) Solvent - некая противоположность плагину AdHesive, исключает выбранную запись из текущей ленты.
Что общего между этими двумя плагинами - то, что и тот, и другой добавляют новый пункт в блоке "Статус записи" на странице создания/редактирования записи.
Т.е. получается, что я нашел способ, как пометить нужную новость, осталось только разобраться как вывести такую запись на страницу, но при этом сделать так, чтобы плагин AdHesive (или Solvent) не выполняли свою основную функцию - закрепление или исключение "избранной" записи.
На глаза мне попался еще один малюсенький плагин, который как раз и пригодился. Get-a-Post - этот плагин, собственно выполняет то же самое, что и query_posts, с одним лишь отличием, что, в добавок, позволяет выводить посты, помеченные sticky-меткой (которую ставит плагин AdHesive). А это и есть как раз то, что мне было нужно. ;)
Из тех двух плагинов воспользовался Solvent, т.к. легко получилось отключить его основную функцию, да и размером он тоже маленький.
Теперь осталось подправить пару строчек в плагинах Solvent и Get-a-Post, чтобы породнить их.
Итак, нужно выполнить следующее:
1) в файле solvent.php находим строку:
- if (!in_array($post->ID, $slippers))
и закомментируем ее, тем самым отключив функцию исключения поста из ленты:
- //if (!in_array($post->ID, $slippers))
2) в этом же файле заменим на нужное (если требуется) слово Slippery (это слово, которое отображается в админке) в следующей строке:
- <div id="solventdiv"><label class="selectit"><input type="checkbox" name="solvent_slippery" value="true"<?php echo $checked; ?/> /> Slippery</label></div>
3) в файле get-a-post.php находим строку:
- $query_suffix = "ID = post_id AND meta_key = 'sticky' AND meta_value = 1";
и заменяем в ней sticky на slippery.
Вуаля! Задача решена.
P.S. Для вывода "избранной" новости в нужное место страницы используется следующая функция:
- <?php get_a_post(GETSTICKY); ?>
После нее нужно вставить теги шаблона, используемые в цикле, такие как the_content(), the_title() и т.д.