Третя частина – продовження статті про створення кастомних сайдбарів у WordPress-темі. У цій частині розглянуто процес додавання форми для вибору сайдбара під час редагування сторінок та категорій.

Попередні пости:

Раніше було розглянуто процес створення кастомних сайдбарів та підміну стандартного в публічній частині сайту. Залишається лише прив’язати ідентифікатор створеного сайдбару до сторінок та категорій.

Ідентифікатор зберігається у метаданих. Метадані категорій та сторінок зберігаються у різних таблицях бази даних. Тому код для категорій та сторінок буде відрізнятися, але зміст його роботи однаковий, це:

  1. створення форми в якій адміністратор сайту вибере сайдбар
  2. скрипт для збереження вибраного сайдбару у базі даних.

Вибір сайдбару для сторінок

Для створення додаткових полів та форм під час редагування сторінок у WordPress передбачені метабокси. Відповідно форма вибору сайдбару перебуватиме у такому метабоксі.

Створення метабоксу

Для того, щоб метабокс з’явився на сторінці редагування, його потрібно зареєструвати (створити) у WordPress і додати функцію для виведення його вмісту. Метабокс реєструється за допомогою функції ядра WordPress add_meta_box (докладний опис https://wp-kama.ru/function/add_meta_box).

Вмістом метабоксу в нашому випадку буде поле форми у вигляді списку сайдбарів, що випадає. Потрібно звернути увагу, що вміст метабоксу і список, що випадає, не потрібно обрамляти в тег form, т.к. на сторінці він вже присутній “глобально”.


<?php

/**
 * Реєстрація сайдбару
 */
function add_custom_columns_meta_box() {
  add_meta_box(
    RESUME_SLUG . '_custom_columns',
    __( 'Пользовательские колонки', RESUME_TEXTDOMAIN ),
    'resume\render_custom_columns_meta_box',
    array( 'page' ),
    'side'
  );
}
add_action( 'add_meta_boxes', 'add_custom_columns_meta_box' );



/**
 * Функція для формування html-коду вмісту метабокса
 */
function render_custom_columns_meta_box( $post, $meta ) {
  global $wp_registered_sidebars;

  // Отримує та виводить приховане одноразове поле захисту (валідації) форми
  wp_nonce_field( plugin_basename( __FILE__ ), 'custom_columns_noncename' );

  // поточний прикріплений до сторінки сайдбар
  $custom_columns = get_post_meta( $post->ID, '_custom_columns', true );

  // список створених сайдбарів із налаштувань теми
  $register_columns = get_theme_mod( 'register_columns', [] );

  // якщо сайдбари створені, то формуємо контент метабоксу
  if ( ! empty( $register_columns ) ) : ?>
    <name class="resume-name" for="custom_columns"><?php _e( 'Выбрать сайдбар', RESUME_TEXTDOMAIN ); ?></name>
    <select class="resume-control" id="custom_columns" name="custom_columns">
      <option value=""><?php _e( 'Стандартная колонка', RESUME_TEXTDOMAIN ); ?></option>
      <?php foreach ( $register_columns as $column ) : ?>
        <option value="<?php echo $column[ 'id' ]; ?>" <?php selected( $custom_columns, $column[ 'id' ], true ); ?> ><?php echo $column[ 'name' ]; ?></option>
      <?php endforeach; ?>
    </select>
  <?php endif;
}

Збереження даних

Збереження сторінки відбувається у хуку save_post. Під час його роботи необхідно записати ідентифікатор садбару в метадані сторінки. Усі поля форми редагування сторінки будуть доступні у глобальному масиві $_POST. Відповідно потрібно перевірити, чи має користувач права на редагування посту, вибрати з масиву $_POST потрібне поле, перевірити його та зберегти.


<?php

/**
 * Функція збереження ідентифікатора сайдбара в метаполі сторінки
 */
function save_custom_columns_metadata( $post_id ) {

  // перевіряємо код захисту створений функцією wp_nonce_field
  if ( ! isset( $_POST[ 'custom_columns_noncename' ] ) ) return;
  if ( ! wp_verify_nonce( $_POST[ 'custom_columns_noncename' ], plugin_basename( __FILE__ ) ) ) return;

  // виключаємо автозбереження
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;

  // перевіряємо права поточного користувача на редагування сторінки
  if ( ! current_user_can( 'edit_post', $post_id ) ) return;

  // валідуємо отриманий ідентифікатор сайдбару перед збереженням
  $custom_columns = sanitize_text_field( $_POST[ 'custom_columns' ] );

  // перевіримо що залишилося після валідації і якщо ідентифікатор існує - зберігаємо його, інакше - видаляємо
  if ( empty( $custom_columns ) ) {
    delete_post_meta( $post_id, '_custom_columns' );
  } else {
    update_post_meta( $post_id, '_custom_columns', $custom_columns );
  }
}
add_action( 'save_post', 'save_custom_columns_metadata' );

Вибір сайдбару для категорій

Алгоритм додавання форми вибору сайдбара для категорій такий як і для сторінок, це створити додаткове поле select зі списком сайдбарів, а потім зберегти ідентифікатор вибраного сайдбару.

Додаткові поля форми

Для категорій у консолі передбачено дві форми, це

  • форма створення категорії
  • Форма редагування категорії.

Верстка та хуки, які працють у цих формах відрізняються, тому потрібно створити дві різні функції, які виведуть поле вибору сайдбару. Також для форми створення категорії не потрібно отримувати дані про вже прикріплений сайдбар, т.к. категорії ще немає і відповідно ніякий сайдбар не прикріплено.

<?php

/**
 * Додавання поля для вибору сайдбару у формі РЕДАКТУВАННЯ категорії
 */
function edit_category_custom_columns( $term ) {

  // отримамуємо ідентифікатор вже прикріпленого до категорії сайдбару
  $custom_columns = get_term_meta( $term->term_id, '_custom_columns', true );

  // отримуємо список створених сайдбарів із налаштувань теми
  $register_columns = get_theme_mod( 'register_columns', [] );

  // формуємо html-код поля вибору сайдбару
  ?>
    <tr class="form-field">
      <th scope="row" valign="top">
        <label for="custom_columns"><?php _e( 'Вибрати сайдбар', RESUME_TEXTDOMAIN ); ?></label>
      </th>
      <td>
        <select class="resume-control" id="custom_columns" name="custom_columns">
          <option value=""><?php _e( 'Стандартна колонка', RESUME_TEXTDOMAIN ); ?></option>
          <?php foreach ( $register_columns as $column ) : ?>
            <option value="<?php echo $column[ 'id' ]; ?>" <?php selected( $custom_columns, $column[ 'id' ], true ); ?> ><?php echo $column[ 'name' ]; ?></option>
          <?php endforeach; ?>
        </select>
      </td>
    </tr>
  <?php
}
add_action( 'category_edit_form_fields', 'edit_category_custom_columns' );



/**
 * Додавання поля для вибору сайдбару у формі СТВОРЕННЯ категорії
 */
function add_category_custom_columns( $taxonomy_slug ) {

  // отримуємо список створених сайдбарів із налаштувань теми
  $register_columns = get_theme_mod( 'register_columns', [] );

  // формуємо html-код поля вибору сайдбару
  ?>
    <div class="form-field">
      <label for="custom_columns"><?php _e( 'Вибрати сайдбар', RESUME_TEXTDOMAIN ); ?></label>
      <select class="resume-control" id="custom_columns" name="custom_columns">
        <option value=""><?php _e( 'Стандартна колонка', RESUME_TEXTDOMAIN ); ?></option>
        <?php foreach ( $register_columns as $column ) : ?>
          <option value="<?php echo $column[ 'id' ]; ?>" ><?php echo $column[ 'name' ]; ?></option>
        <?php endforeach; ?>
      </select>
    </div>
  <?php
}
add_action( 'category_add_form_fields', 'add_category_custom_columns' );

Збереження полів форми

Збереження даних категорії під час створення та редагування відбувається під час роботи різних хуків, це

  • create_category
  • edited_category

Алгоритм роботи однаковий, тому можна створити одну функцію, але підключити її до обох хуків. Функція робитиме наступне:

  1. перевірить чи має поточний користувач права на редагування категорії
  2. перевірить nonce-поле безпеки
  3. провалідує ідентифікатор сайдбару із глобального масиву $_POST
  4. збереже або видалить ідентифікатор із метаданих категорії
<?php

/**
 * Функція збереження ідентифікатора прикріпленого сайдбару у метаполі категорії
 */
function save_category_custom_columns( $term_id ) {
  if ( ! current_user_can( 'edit_term', $term_id ) ) return;
  if (
    ( isset( $_POST[ '_wpnonce' ] ) && ! wp_verify_nonce( $_POST[ '_wpnonce' ], "update-tag_$term_id" ) ) ||
    ( isset( $_POST[ '_wpnonce_add-tag' ] ) && ! wp_verify_nonce( $_POST[ '_wpnonce_add-tag' ], "add-tag" ) )
  ) return;
  $custom_columns = ( isset( $_POST[ 'custom_columns' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'custom_columns' ] ) ) : '';
  if ( empty( $custom_columns ) ) {
    delete_term_meta( $term_id, '_custom_columns' );
  } else {
    update_term_meta( $term_id, '_custom_columns', $custom_columns );
  }
  return $term_id;
}
add_action( 'create_category', 'save_category_custom_columns' );
add_action( 'edited_category', 'save_category_custom_columns' );

Вывод

Повний код доступний за посиланням https://github.com/chomovva/resume/blob/master/includes/custom-columns.php

51голос
Рейтинг статті
Підписатися
Сповістити про
guest
0 Коментарі
Вбудовані Відгуки
Переглянути всі коментарі
0
Ми любимо ваші думки, будь ласка, прокоментуйте.x
()
x