Два публичных статуса в 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
1 2 |
, 'public' => true , 'exclude_from_search' => true |
4. Теперь в том месте, где у нас идёт запрос списка постов добавляем фильтр по статусу в него (т.е. чтобы в списке отображались только посты со статусом pubish).
1 2 3 |
global $wp_query; $args = array_merge( $wp_query->query_vars, array( 'post_status' => 'publish' ) ); query_posts( $args ); |
5. А вот пример работы логики вида (используется плагин Pods Framework).
1 2 3 4 |
$object = pods( 'custom_object_type', $id ); <?php if($object->display( 'custom_object_type' ) == 'skryitaya'): ?> Some content <?php endif; ?> |
Собственно результат достигнут.