Я уже писал про добавление метабоксов к постам (записям, страницам, произвольным типам постов), теперь давайте разберемся, как добавлять произвольные поля (дополнительные настройки) на страницы редактирования рубрик, меток и прочих таксономий, которые вы можете насоздавать.
Опять-таки сразу вас предупрежу, что у вас нет необходимости писать с нуля весь код самим. Можете воспользоваться плагином Carbon Fields например, но тут же я обещал всё делать без плагинов.
Итак, вот что мы будем создавать в этом уроке:
В общем я решил не придумывать каких-то бесполезных примеров и сделать всё так же, как в примере с обычными метабоксами – добавить SEO-поля для рубрик.
1. Добавляем поля на страницу со всеми рубриками, в форму добавления рубрики
Для того, чтобы поля появились на странице добавления рубрики, мы воспользуемся хуком {название таксономии}_add_form_fields
и в функции, которую мы к нему прикрепим, нам достаточно вывести эти поля.
add_action( 'category_add_form_fields', 'true_add_cat_fields' ); function true_add_cat_fields( $taxonomy ) { echo '<div class="form-field"> <label for="seo-title">SEO-заголовок</label> <input type="text" name="seo_title" id="seo_title" /> </div> <div class="form-field"> <label><input type="checkbox" name="seo_robots" /> Скрыть от поисковиков</label> </div>'; }
Плюс-минус ничего сложного, вам даже не нужно беспокоиться о заполнении значений этих полей. Это финиш с этим шагом.
И да, надеюсь, что вы знаете, куда вставлять код.
2. Добавляем поля на страницу редактирования рубрики
Принцип очень похож, по сути отличается лишь хук, он будет называться {название таксономии}_edit_form_field
ну и да, тут уже нужно будет постараться заполнить значения полей из базы данных!
add_action( 'category_edit_form_fields', 'true_edit_term_fields', 10, 2 ); function true_edit_term_fields( $term, $taxonomy ) { // сначала получаем значения этих полей // заголовок $seo_title = get_term_meta( $term->term_id, 'seo_title', true ); // скрытие от поисковиков $seo_robots = get_term_meta( $term->term_id, 'seo_robots', true ); echo '<tr class="form-field"> <th> <label for="seo_title">SEO-заголовок</label> </th> <td> <input name="seo_title" id="seo_title" type="text" value="' . esc_attr( $seo_title ) .'" /> </td> </tr> <tr> <th>Скрыть из поисковиков</th> <td> <label><input type="checkbox" name="seo_robots" ' . checked( 'yes', $seo_robots, false ) . ' /> Да</label> </td> </tr>'; }
И результат:
3. Сохранение значений полей
Тут всё легко – вешаем единственную функцию для сохранения полей на сразу два хука – created_{название таксономии}
и edited_{название таксономии}
.
В нашей ситуации функция будет выглядеть вот так:
add_action( 'created_category', 'true_save_term_fields' ); add_action( 'edited_category', 'true_save_term_fields' ); function true_save_term_fields( $term_id ) { if( isset( $_POST[ 'seo_title' ] ) ) { update_term_meta( $term_id, 'seo_title', sanitize_text_field( $_POST[ 'seo_title' ] ) ); } else { delete_term_meta( $term_id, 'seo_title' ); } if( isset( $_POST[ 'seo_robots' ] ) && 'on' == $_POST[ 'seo_robots' ] ) { update_term_meta( $term_id, 'seo_robots', 'yes' ); } else { delete_term_meta( $term_id, 'seo_robots' ); } }
4. Очищаем поля формы при добавлении таксономии через AJAX
И этот шаг – небольшой бонус для вас. Дело в том, что добавляются таксономии через AJAX и по умолчанию очищаются только текстовые поля. А у нас там например чекбокс. Что, если я хочу его переводиться в нечекнутое состояние каждый раз после добавления рубрики?
Тут нам понадобится немного JavaScript, который можно повесить как на хуки admin_head
, admin_footer
, так и засунуть в произвольный файл.
Пробуем:
jQuery( function( $ ) { $(document).ajaxSuccess(function(evt, xhr, opts){ if ( xhr.status >= 200 && xhr.status < 300 && opts.data && /(^|&)action=add-tag($|&)/.test(opts.data) && /(^|&)taxonomy=category($|&)/.test(opts.data) // тут укажите свою таксономию && xhr.responseXML && $('wp_error', xhr.responseXML).length == 0 ) { $( "#seo_robots" ).prop( "checked", false ); } }); });
5. Вывод значений произвольных полей элементов таксономий на сайте
Ну во-первых, нам понадобится одна-единственная функция get_term_meta() для получения значений этих полей.
Затем я воспользуюсь хуком pre_get_document_title изменения тайтла страницы и хуком wp_head для вывода мета-тега robots.
add_filter( 'pre_get_document_title', 'true_seo_title_for_cats', 25 ); function true_seo_title_for_cats(){ if( is_category() && ( $title = get_term_meta( get_queried_object_id(), 'seo_title', true ) ) ) { return $title; } return ''; } add_action( 'wp_head', 'true_seo_robots_for_cats', 25 ); function true_seo_robots_for_cats() { if( is_category() && 'yes' === get_term_meta( get_queried_object_id(), 'seo_robots', true ) ) { echo '<meta name="robots" content="noindex,nofollow" />'; } }