Добавление подзаголовка к названию товара WooCommerce

3 окт. 2013 г., 20:07:16
Просмотры: 28.6K
Голосов: 8

Я использую WooCommerce на сайте, построенном на фреймворке Pagelines. Мне нужно, чтобы подзаголовок/настраиваемое поле отображалось под названием товара везде, где оно появляется на сайте. На данный момент WooCommerce не предлагает такой опции.

Я пробовал использовать произвольные поля, но WooCommerce тоже их использует и выводит много ненужной информации вместе с моим подзаголовком. Если я назову свое произвольное поле "bookauthor", будет ли работать этот код для отображения только нужного мне произвольного поля?

<?php echo get_post_meta($id, "bookauthor", true); ?>

И если да, как сделать так, чтобы мое новое поле выводилось сразу после заголовка товара на фронтенде?

Я нашел нужные хуки в этом php файле (я думаю, я не знаю php, поэтому я спрашиваю):

<?php 
/*
  * @hooked woocommerce_template_single_title - 5
  * @hooked woocommerce_template_single_price - 10
  * @hooked woocommerce_template_single_excerpt - 20
  * @hooked woocommerce_template_single_add_to_cart - 30
  * @hooked woocommerce_template_single_meta - 40
  * @hooked woocommerce_template_single_sharing - 50
*/
?>

Я знаю, как отфильтровать, но как добавить произвольное поле в этот список?

Или есть совершенно другой способ достичь того, что мне нужно?

Бесконечная благодарность всем, кто может помочь.

0
Все ответы на вопрос 2
1

Чтобы ответить на ваш первый вопрос, получение вашего post meta »bookauthor« таким образом просто выведет его на экран. Если вы правильно определили переменную $id в вашем коде — или вы можете сделать это, как показано ниже.

Код ниже должен ответить на ваш второй вопрос о том, как добавить вторую строку заголовка на страницу продукта с помощью хука woocommerce_single_product_summary. Просто добавьте вашу дополнительную информацию следующим образом:

    function wpse116660_wc_add_2nd_title() {
        ?>
        <div class="2nd-tile">
            <?php echo get_post_meta(get_the_ID(), "bookauthor", true); ?>
        </div>
        <?php
    }
    add_action( 'woocommerce_single_product_summary', 'wpse116660_wc_add_2nd_title', 6 );

Для большего удобства работы с вашими пользовательскими метаданными записи вы можете сделать то, что предложили @pl4g4 и @brasofilo, и добавить метабокс на экран редактирования продукта, но это, конечно, не обязательно, вы, похоже, знаете, как это сделать с помощью стандартного метабокса пользовательских полей WordPress.


Вы можете добавить свой метабокс следующим образом, код основан на первом примере со страницы add_meta_box в кодексе WordPress.

/**
 * Добавляет блок в основную колонку на экранах редактирования записи и страницы.
 */
function wpse116660_wc_2nd_title_mb() {

    $screen = array( 'product' );

        add_meta_box(
            'wc_2nd_title_mb',
            __( '2nd title', 'your_textdomain' ),
            'wc_2nd_title_inner_mb',
            $screen,
            'advanced',
            'high'
        );
}
add_action( 'add_meta_boxes', 'wpse116660_wc_2nd_title_mb', 0 );

/**
 * Выводит содержимое блока.
 * 
 * @param WP_Post $post Объект текущей записи/страницы.
 */
function wpse116660_wc_2nd_title_inner_mb( $post ) {

  // Добавляем nonce для проверки в дальнейшем.
  wp_nonce_field( 'wc_2nd_title_inner_mb', 'wc_2nd_title_inner_mb_nonce' );

  /*
   * Используем get_post_meta() для получения существующего значения
   * из базы данных и используем его для формы.
   */
  $value = get_post_meta( $post->ID, 'bookauthor', true );

  echo '<label for="bookauthor_field">';
       _e( "Автор книги", 'your_textdomain' );
  echo '</label> ';
  echo '<input type="text" id="bookauthor_field" name="bookauthor_field" value="' . esc_attr( $value ) . '" size="50" />';

}

/**
 * Сохраняет наши пользовательские данные при сохранении записи.
 *
 * @param int $post_id ID сохраняемой записи.
 */
function wpse116660_wc_2nd_title_save_postdata( $post_id ) {

  /*
   * Нам нужно убедиться, что это пришло с нашего экрана и с правильной авторизацией,
   * потому что save_post может быть вызван в других случаях.
   */

  // Проверяем, установлен ли наш nonce.
  if ( ! isset( $_POST['wc_2nd_title_inner_mb_nonce'] ) )
    return $post_id;

  $nonce = $_POST['wc_2nd_title_inner_mb_nonce'];

  // Проверяем, что nonce действителен.
  if ( ! wp_verify_nonce( $nonce, 'wc_2nd_title_inner_mb' ) )
      return $post_id;

  // Если это автосохранение, наша форма не отправлена, поэтому ничего не делаем.
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
      return $post_id;

  // Проверяем права пользователя.
  if ( 'page' == $_POST['post_type'] ) {

    if ( ! current_user_can( 'edit_page', $post_id ) )
        return $post_id;

  } else {

    if ( ! current_user_can( 'edit_post', $post_id ) )
        return $post_id;
  }

  /* OK, теперь безопасно сохранять данные. */

  // Очищаем введенные пользователем данные.
  $mydata = sanitize_text_field( $_POST['bookauthor_field'] );

  // Обновляем метаполе в базе данных.
  update_post_meta( $post_id, 'bookauthor', $mydata );
}
add_action( 'save_post', 'wpse116660_wc_2nd_title_save_postdata' );
4 окт. 2013 г. 00:32:26
Комментарии

+1. Использование add_action с приоритетом 6 разместит подзаголовок сразу после основного заголовка (который имеет приоритет 5). Если автор вопроса не хочет добавлять собственный метабокс, я уже написал плагин для подзаголовков, который сохраняет данные.

helgatheviking helgatheviking
4 окт. 2013 г. 13:48:10
2

Вы можете добавить дополнительный метабокс к записи товара. Этот метабокс должен содержать поле ввода для подзаголовка. После добавления метабокса сохраните значение в post_meta при сохранении товара. Затем на странице отдельного товара в шаблоне WooCommerce используйте код:

<?php echo get_post_meta($id, "bookauthor", true); ?>

чтобы получить сохраненное значение.

Информацию о метабоксах можно найти здесь и также здесь.

3 окт. 2013 г. 23:20:55
Комментарии

Или используйте Advanced Custom Fields или поищите в нашем архиве.

brasofilo brasofilo
3 окт. 2013 г. 23:38:19

+1, но пожалуйста, не публикуйте ссылки на внешние источники. Если вам нужно это сделать, то пожалуйста, также кратко изложите, что написано (код) в цели ссылки.

kaiser kaiser
4 окт. 2013 г. 01:16:48