Внимание! Данная статья устарела, неактуальна и представляет лишь исторический интерес.
Благодаря доработке функционала плагина Wp-Recall и в частности дополнения публикации появилась возможность более гибко влиять на вывод формы публикации от плагина Wp-Recall. Рассмотрим несколько примеров воздействия на выводимую форму публикации для получения желаемого результата.
Итак, напомню, что вывод формы публикации осуществляется шорткодом [ public-form ].
Но мало кто знает, что мы можем публиковать через данную форму записи не только типа post, но и любого другого типа, который нам необходим. Допустим, на нашем сайте есть записи произвольного типа custom-type. Данные записи мы можем публиковать через админку и с этим все замечательно, но как быть если появилось желание дать возможность публикации новых записей этого типа через фронт-энд сайта, с его страниц, другим пользователям? Для решения этой задачи достаточно указать в шорткоде формы публикации нужный тип записи через атрибут post_type. Например:
[ public-form post_type='custom-type' ]
после чего данная форма будет публиковать записи указанного типа.
У произвольных типов записей часто присутствуют свои таксономии, которые необходимо также назначать для публикуемой записи. Чтобы вывести в форме публикации список существующих терминов таксономии данного типа записи для их выбора, необходимо указать какая именно таксономия используется для данного типа записи. Например:
add_filter('taxonomy_public_form_rcl','add_taxonomy_publicform'); function add_taxonomy_publicform($tax){ //указываем таксономию custom-tax для типа записи custom-type if (!$tax['custom-type']) $tax['custom-type'] = 'custom-tax'; return $tax; }
В результате форма публикации начнет предлагать для типа записи custom-type существующие термины таксономии custom-tax.
Форма публикации при своем выводе всегда по-умолчанию выводит весь набор необходимых для публикации полей, куда входят: заголовок, редактор, загрузчик медиафайлов и произвольные поля, если они были созданы.
Рассмотрим возможности по отключению определенных элементов формы публикации, если они нам, по каким то причинам, стали не нужны. Для этого необходимо обратиться через фильтр формы публикации к массиву настроек формы и отключить, то что нам не нужно:
add_filter('fields_public_form_rcl','edit_publicform_rcl',10,2); function edit_publicform_rcl($fields,$data){ $fields = array( 'title'=>true, //поле заголовка 'termlist'=>true, //выпадающий список таксономии типа записи 'editor'=>true, //поле редактирования основного контента записи 'custom_fields'=>true, //список произвольных полей 'tags'=>true, //поле метки, только для типа post 'upload'=>true //возможность загрузки медиафайлов ); return $fields; }
В созданную функцию edit_publicform_rcl() мы получаем массив полей формы публикации и которые по-умолчанию имеют значение true, если какое то конкретное поле формы нам не требуется для вывода, то мы проставляем ему значение false или 0.
Второй аргумент созданной функции передает нам данные создаваемой или уже созданной публикации (если идет ее редактирование), используя которые мы можем проставлять различные проверки, например, о принадлежности поста к нужному типу записи:
add_filter('fields_public_form_rcl','edit_publicform_rcl',10,2); function edit_publicform_rcl($fields,$data){ if($data->post_type!='custom-type') return $fields; $fields = array( 'title'=>true, 'termlist'=>false, 'editor'=>true, 'custom_fields'=>false, 'tags'=>false, 'upload'=>false ); return $fields; }
В итоге форма публикации для типа записи custom-type будет иметь только заголовок и редактор, все остальные поля будут убраны. Такая же картина будет наблюдаться при редактировании записи такого типа.
Допустим, мы убрали из формы даже поле заголовка и необходимо, чтобы заголовок при публикации назначался по какому то единому шаблону или был вообще для всех типов записи одинаков. Для этого заголовок надо переназначить через простой код
add_filter('pre_update_postdata_rcl','add_custom_post_title'); function add_custom_post_title($post){ if (!$post['post_title']) $post['post_title'] = 'Тут заголовок какой нам нужен'; return $post; }
В функцию add_custom_post_title() мы получаем данные публикуемой или редактируемой записи перед ее сохранением в БД и редактируем их нужным нам образом, в данном случае, мы назначаем свой заголовок, если он отсутствует.
По-умолчанию, все записи будут сразу публиковаться, поэтому имеет смысл посылать записи с формы на модерацию:
add_filter('pre_update_postdata_rcl','edit_post_status_rcl'); function edit_post_status_rcl($post){ if($post['post_type']!='custom-type') return $post; $post['post_status'] = 'pending'; return $post; }
Иногда возникает необходимость добавить в форму публикации какие то свои поля, которые будут передавать данные для дальнейшей обработки. Рассмотрим возможность добавления своего текстового поля в форму публикации и обработку данных полученных от этого добавленного поля.
Для начала выведем наше поле в форме публикации:
add_filter('public_form_rcl','add_custom_field_publicform',10,2); function add_custom_field_publicform($fls,$data){ //делаем проверку на тип записи if($data->post_type!='custom-type') return $fls; $fls .= '<label>Имя поля <span class="required">*</span>:</label> <input type="text" required name="name-field" id="name-field" value="">'; return $fls; }
С помощью кода выше мы добавили в форму публикации наше текстовое поле, которые будет выводится только при публикации или редактировании записей типа custom-type.
Данные отправленные из этого поля будут обрабатываться с помощью кода ниже:
add_action('update_post_rcl','save_fielddata_publicform',10,2); function save_fielddata_publicform($post_ID, $postdata){ global $wpdb; if($postdata['post_type']!='custom-type') return false; if(isset($_POST['name-field'])) $field = $_POST['name-field']; else $field = 0; update_post_meta($post_ID,'name-field',$field); }
Чтобы не усложнять код мы просто сохранили полученные данные из нашего поля в произвольное поле публикуемой или редактируемой записи, но при желании можно как угодно обрабатывать эти данные и сохранять туда куда нужно.
Если к форме публикации произвольного типа записи необходимо прикрепить функционал произвольных полей Wp-Recall, то вникаем в статью "Добавляем произвольные поля к произвольному типу записи через форму публикации Wp-Recall"
Перечисленные манипуляции с формой публикации позволят вам выводить форму практически любой конфигурации и для любого типа записей. Некоторые элементы формы, которые невозможно убрать указанными методами можно легко убрать используя css-стили, но в дальнейшем настроек для формы станет больше и надеемся, что в будущем не придется делать даже этого.
Это нереально круто. Мало того что вордпресс не имеет публикации через фронтэнд, а ты это реализовал (в таком комплексе как Wp-Recall), так еще и все так гибко настраивается. Обязательно возьму этот урок на заметку. Как раз планировал вплотную на выходных освоить и внедрить кастомную публикацию пользователями.
Дополнил статью описанием процесса внедрения в форму своих полей и обработки данных от них.
Получается можно метабокс из админки перенести во фронтэнд. Круто. То что нужно. Пока не пробывал - селекты тоже можно в форме выводить? Думаю что да - в метабоксе то есть это.
Я не пробовал) но по идее можно вывести в форме все, главное суметь это потом обработать.
А как отключить визуальный редактор и сделать симпл текст?
Тип редактора можно менять атрибутом type_editor шорткода [public-form]. Указывая в нем цифры от 1 до 3 можно менять его тип. Но при редактировании публикации тип редактора все равно будет как выставили в общих настройках дополнения публикации, поэтому атрибут в шорткоде подойдет в случае, если редактирование публикации не предвидится.
Произвольный текст в редактор ставить пока нельзя.
хм, произвольный текст очень нужен.)
При редактировании новости выбранная категории новости устанавливается по умолчанию (первая по алфавите).. Как сделать что бы при редактировании сохранялась выбранная рубрика?
Если ввести в шорткод id формы публикации и post_type отличный от post, то произвольные поля не появляются. Это достаточно странно, поскольку подразумевается, что поля могут использоваться в любом типе записи.
Андрей, подскажи пожалуйста, как с помощью функции edit_publicform_rcl, пример которой ты пишешь, скрывать/добавлять Произвольные поля формы публикации, создаваемые с помощью recall, помимо стандартных:
$fields = array(
'title'=>true, //поле заголовка
'termlist'=>true, //выпадающий список таксономии типа записи
'editor'=>true, //поле редактирования основного контента записи
'custom_fields'=>true, //список произвольных полей
'tags'=>true, //поле метки, только для типа post
'upload'=>true //возможность загрузки медиафайлов
);
?
не понял вопроса. Пример отключения вывода произвольных полей в форме публикации приведен в статье, если речь об этом.
Да, с помощью 'custom_fields'=>true/false. А как скрыть конкретное произвольное поле из нескольких? Например, я создал два произвольных поля тест1 и тест2 и хочу реализовать проверку, по результатам которой выводится только тест1 или тест2. Знаю что можно выводит разные произвольные поля для разных форм публикации, но хотелось бы для одной формы реализовать условия вывода конкретного произвольного поля.
Сейчас скрыть определенное произвольное поле можно используя только прописав для него отдельные стили display:none, но в следующей версии станет возможно влиять на вывод каждого поля по отдельности через новые фильтры плагина.
Спасибо за инфу, подскажи пожалуйста, когда ожидать релиз?
никакой даты назвать не могу, выйдет когда будет готово.
Андрей приветствую, подскажи в версии 11.0.0 появился функционал, про который я спрашивал выше?
да, вы можете исключать вывод отдельных произвольных полей из формы публикации, используя новый фильтр "custom_field_public_form".
Данный фильтр первым аргументом передает данные текущего произвольного поля, а вторым данные формы публикации Array('ID','post_type','form_id')
Есть такой вопрос, для произвольного типа записи возможно ли вывести в форме несколько таксономий? Ведь такая возможность в вордпресс присутствует
такой возможности нет, формой пока поддерживается только одна таксономия
Андрей скажите, а можно в отдельное нужное поле формы, заложить какой нибуть шорт код,что бы текст из поля публиковался уже с шорт кодом, и потом его подхватывал другой плагин.
вы можете прописывать в полях формы шорткоды, но для того, чтобы этот шорткод сработал в нужном месте необходимо контент этого поля пропустить через фильтр the_content:
Здраствуйте. Добавил дополнительное поле по образцу из статьи. Данные из него сохраняются в базу но при редактировании записи поле пустое. Не подскажите почему?
Не могли бы вы привести пример скрытия полей из формы публикации используя фильтр "custom_field_public_form" для определённой группы пользователей
Возможно ли отключить стандартные элементы формы публикации только при публикации в определённых категориях?
Думаю да. Используйте условные теги, вам нужен is_category http://wp-kama.ru/function/is_category
Совпадает - применяете фильтр - исключая то, что вам не нужно
Полезная статья. А по формам публикации типов записи donate и notes она актуальна? А то не получается вывести свои поля с помощью этого кода.
информация должна быть актуальной для публикаций любого типа
Форма публикации вродь по такому же принципу действует как плагин гостевых постов. Не?
вродь да
Возможно ли реализовать фп так, чтоб незалогиненный пользователь публикуя запись, автоматически залогиневался под тем пользователем что уже зарегистрирован по указанному гостем емейлом? Также его публикация автомаматически закреплялась за ним.
ага, и любой мог получить доступ к аккаунту пользователя только указав его емейл при публикации? у себя на сайте можете такую жесть устраивать, от плагина только этого требовать не надо.
Нет, я даже не думал об этом, просто было бы оч. удобно.
Что удобного? Зная мыло получить доступ? Глупости говорите. Сначала тогда подумайте, потом пишите
Спасибо, за познавательную статью.
Заинтересовала функция автоматического заполнения заголовков, в случае их отсутствия. Можно таким же образом в качестве заголовка вывести например несколько первых самого поста? например за счет excerpt?
Всем доброго времени суток! А как с своими таксономиями сделать не выпадающий список, чекбоксы и мультиплекс, а радиокнопки? Что бы список был радиокнопками и можно было выбрать только одну категорию? Нужно вывести таксономии не списком, а кнопками, но разрешить для выбора только один вариант... Спасибо за ответ!
такие вопросы лучше задавать на форуме, сделать можно
Добрый день. Подскажите пожалуйста , если возможность в публикациях сделать вкладки. Чтобы в созданном посте было например , вкладка основная информация, видео материалы, фото материалы, прайс например да и вообще любые по желаю вкладки. Это для того чтобы публикация выглядела как отдельная страница и было удобно читать публикацию. И публикация не растянута на метр в низ сайта, а в зоне высоты монитора. Это очень профессионально будет выглядеть для сайта бизнеса. Я иммею ввиду вкладки как вы сделали в профиле. Если есть такое расширение, натолкните меня на него.