• Добрый день.
    Может кто-то делал уже или есть готовое решение как добавить дополнительное (второе) описание для атрибутов и меток, что бы выводилось под товарами.
    И стандартное описание в атрибутах не выводится, как его включить?
    Спасибо)

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Автор newjey

    (@newjey)

    Есть вот такой код для дополнительного описания категорий:

    add_action( 'product_cat_edit_form_fields', 'wpm_taxonomy_edit_meta_field', 10, 2 );
    function wpm_taxonomy_edit_meta_field($term) {
    $t_id = $term->term_id;
    $term_meta = get_option( "taxonomy_$t_id" );
    $content = $term_meta['custom_term_meta'] ? wp_kses_post( $term_meta['custom_term_meta'] ) : '';
    $settings = array( 'textarea_name' => 'term_meta[custom_term_meta]' );
    ?>
    <tr class="form-field">
    <th scope="row" valign="top"><label for="term_meta[custom_term_meta]">Дополнительное описание</label></th>
    <td>
    <?php wp_editor( $content, 'product_cat_details', $settings ); ?>
    </td>
    </tr>
    <?php
    }
    add_action( 'edited_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
    add_action( 'create_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
    function save_taxonomy_custom_meta( $term_id ) {
      if ( isset( $_POST['term_meta'] ) ) {
        $t_id = $term_id;
        $term_meta = get_option( "taxonomy_$t_id" );
        $cat_keys = array_keys( $_POST['term_meta'] );
        foreach ( $cat_keys as $key ) {
          if ( isset ( $_POST['term_meta'][$key] ) ) {
            $term_meta[$key] = wp_kses_post( stripslashes($_POST['term_meta'][$key]) );
          }
        }
        update_option( "taxonomy_$t_id", $term_meta );
      }
    }
    add_action( 'woocommerce_after_shop_loop', 'wpm_product_cat_archive_add_meta' );
    function wpm_product_cat_archive_add_meta() {
      $t_id = get_queried_object()->term_id;
      $term_meta = get_option( "taxonomy_$t_id" );
      $term_meta_content = $term_meta['custom_term_meta'];
      if ( $term_meta_content != '' ) {
    	  if ( ! preg_match('#/(attribute|brand|shop)#', $_SERVER['REQUEST_URI']) ) {
        if ( is_tax( array( 'product_cat', 'product_tag' ) ) && 0 === absint( get_query_var( 'paged' ) ) ) {
          echo '<div class="woo-sc-box normal rounded full">';
          echo apply_filters( 'the_content', $term_meta_content );
          echo '</div>';
        }
      }
      }
    }

    Как можно его переделать или изменить для меток и атрибутов?

    Модератор Юрій

    (@yube)

    Как можно его переделать или изменить для меток и атрибутов?

    Его надо выбросить за использование option там, где нужно использовать предназначенные для этого term_meta.

    Автор newjey

    (@newjey)

    Не совсем правильно понял вас. Этот код не верный?

    Модератор Юрій

    (@yube)

    В этом коде используется неправильный (сильно устаревший) способ хранения метаданных. При этом он может быть «верным» в том смысле, что выполняет поставленную перед ним задачу. Но неправильность вылезет боком, рано или поздно, так или иначе. Поэтому делать надо сразу правильно.

    Автор newjey

    (@newjey)

    Понял, есть готовый правильный метод? Что бы сразу сделать как надо.

    Модератор Юрій

    (@yube)

    Правильный способ хранения метаданных термов — использовать функции ряда *_term_meta, такие как update_term_meta(), get_term_meta() и т.д.

    Автор newjey

    (@newjey)

    Юрий, спасибо за ответы, а можете подсказать как уже существующий код переделать под метки и атрибуты?

    Модератор Юрій

    (@yube)

    Подсказать — могу. Но не более того.

    1. заменить способ хранения метаданных на каноничный
    get_option( "taxonomy_$t_id" );
    на
    get_term_meta($t_id, 'second_description', 1);
    и
    update_option( "taxonomy_$t_id", $term_meta );
    на
    update_term_meta($t_id, 'second_description', $term_meta);

    2. Перевесить обработчики на соответствующие задаче хуки и поменять там, где требуется, имена таксономий.

    Автор newjey

    (@newjey)

    Спасибо большое)

    Автор newjey

    (@newjey)

    Подскажите пожалуйста, если не трудно. Что-то код вордпресса мне тяжело дается.
    Добавил в код выше вывод поля дополнительного описания в бренде
    add_action( 'product_brand_edit_form_fields', 'wpm_taxonomy_edit_meta_field', 10, 2 );
    Поле появилось в редактировании бренда, но не сохраняется и соответственно не выводится. Как мне указать ему что бы сохраняло в базу?
    Спасибо.

    Модератор Юрій

    (@yube)

    но не сохраняется

    Видимо потому, что нет обработчика хуков create_такса и edited_такса.
    См. пример https://wp-kama.ru/hook/taxonomy-_edit_form_fields

    Автор newjey

    (@newjey)

    А откуда берутся эти обработчики?

    add_action( 'edited_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
    add_action( 'create_product_cat', 'save_taxonomy_custom_meta', 10, 2 );

    Они ж не произвольные?

    Модератор Юрій

    (@yube)

    А откуда берутся эти обработчики?

    Оттуда же, откуда и вывод формы для ввода — от кодера. Вывод формы и сохранение результата, как правило, ходят парами.

    Автор newjey

    (@newjey)

    Спасибо, прописал

    add_action( 'edited_product_brand', 'save_taxonomy_custom_meta', 10, 2 );
    add_action( 'create_product_brand', 'save_taxonomy_custom_meta', 10, 2 );

    Теперь сохраняется, осталось только вывести) Можете с этим подсказать?

    Модератор Юрій

    (@yube)

    Можете с этим подсказать?

    Нет. Вывод очень сильно зависит от того, где нужно вывести, и от того, как там всё устроено. Иногда хватает обработчика хука, иногда приходится создавать дочернюю тему, а в редких случаях даже клонировать (форкать) тему ради нескольких дополнительных слов.

    А как получить то, что нужно|можно вывести, у Тимура написано.

    • Ответ изменён 4 года назад пользователем Юрій.
Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Тема «Дополнительное описание для атрибутов» закрыта для новых ответов.