Поддержка WooCommerce Дополнительное описание для атрибутов

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

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Есть вот такой код для дополнительного описания категорий:

    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.

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

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

    (@yube)

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

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

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

    (@yube)

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

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

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

    (@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. Перевесить обработчики на соответствующие задаче хуки и поменять там, где требуется, имена таксономий.

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

    Подскажите пожалуйста, если не трудно. Что-то код вордпресса мне тяжело дается.
    Добавил в код выше вывод поля дополнительного описания в бренде
    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

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

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

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

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

    (@yube)

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

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

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

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

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

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

    (@yube)

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

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

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

    • Ответ изменён 1 неделя назад пользователем Юрий.
Просмотр 15 ответов — с 1 по 15 (всего 18)