Добавление подзаголовка к названию товара WooCommerce
Я использую 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
*/
?>
Я знаю, как отфильтровать, но как добавить произвольное поле в этот список?
Или есть совершенно другой способ достичь того, что мне нужно?
Бесконечная благодарность всем, кто может помочь.

Чтобы ответить на ваш первый вопрос, получение вашего 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' );

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

Вы можете добавить дополнительный метабокс к записи товара. Этот метабокс должен содержать поле ввода для подзаголовка. После добавления метабокса сохраните значение в post_meta при сохранении товара. Затем на странице отдельного товара в шаблоне WooCommerce используйте код:
<?php echo get_post_meta($id, "bookauthor", true); ?>
чтобы получить сохраненное значение.

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