Два публичных статуса в WordPress
// 10 марта, 2015 // CMS, PHP, WordPress
В этом посте я расскажу, как сделать так, чтобы у вас в WordPress было бы два публичных статуса. Публичный статус присваивается постам (или другим объектам сайта), которые доступны пользователям без дополнительных условия (ввод пароля и т.д.).
Задача
Когда на сайте есть объекты, которые часто включаются-выключаются — то это не нравится поисковикам. Например, есть у нас объекты, которые размещаются на один месяц, а потом убираются, а потом снова могут быть размещены. Это вызывает т.н. эффект мигания. Поисковики такие страницы очень не любят. Поэтому необходимо сделать так, чтобы у таких объектов скрывались контакты, но сами они были доступны. Необходимо сделать в WordPress второй публичный статус (аналог статуса Public) для объекта сайта (custom post type), и реализовать логику отображения по этому статусу. При этом данные объекты должны скрываться из поиска, но быть доступными по прямой ссылке.
Решение
Для добавления новых статусов можно использовать функцию register_post_status, а можно поставить простенький плагин, который на гуевый манер будет добавлять новые статусы.
1. Ставим плагин EditFlow. Нас интересует его модуль Custom Statuses. Его особенность в том, что статусы можно привязывать не только к обычным постам, но и к кастомным объектам сайта (custom_post_type).
2. Идём в настройки модуля плагина, удаляем статусы, которые он нам понаделал и добавляем новый.
3. По-умолчанию все статусы модуля не публичные. Чтобы наш статус стал публичным — делаем небольшое изменение в модуле (не люблю я это дело, но приходится).
в строку 245 файла /wp-content/plugins/eit-flow/modules/custom-status/custom-status.php
, 'public' => true , 'exclude_from_search' => true
4. Теперь в том месте, где у нас идёт запрос списка постов добавляем фильтр по статусу в него (т.е. чтобы в списке отображались только посты со статусом pubish).
global $wp_query; $args = array_merge( $wp_query->query_vars, array( 'post_status' => 'publish' ) ); query_posts( $args );
5. А вот пример работы логики вида (используется плагин Pods Framework).
$object = pods( 'custom_object_type', $id ); <?php if($object->display( 'custom_object_type' ) == 'skryitaya'): ?> Some content <?php endif; ?>
Собственно результат достигнут.
Спасибо!
Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это: