Как добавить табу на страницу товара

В плагине WooCommerce есть возможность добавлять свои табы с помощью фильтра woocommerce_product_tabs и добавление выглядит примерно таким образом:

function custom_tab_render_content() {
    echo 'custom tab content';
}

add_filter( 'woocommerce_product_tabs', function ( $tabs = [] ) {
    $tabs['new_custom_one'] = [
        'title'    => __( 'New Custom Tab' ),
        'priority' => 40,
        'callback' => 'custom_tab_render_content',
    ];

    return $tabs;
} );

Код нужно добавлять в дочернюю тему или в плагин ProFunctions.

Но в теме Bono добавлена дополнительная возможность управлять табами во Внешний вид > Настроить > WooCommerce > Товар. Здесь можно включить или выключить вывод ненужных табов, а также перестроить порядок их вывода. Чтоб это работало с вашей новой табой, необходимо её добавить в настройки кастомайзера с помощью фильтра bono_customize_product_tabs:

add_filter( 'bono_customize_product_tabs', function ( $tabs = [] ) {
    $tabs['new_custom_one'] = __( 'New Custom Tab' );

    return $tabs;
} );

После этого она появится в кастомайзере.

Вывод контента в новой табе

В первом примере кода выводится общий контент для всех товаров:  custom tab content. Но наверняка этот контент должен быть свой у каждого товара. Это можно улучшить, добавив дополнительное поле

для этого нужно добавить код:

add_action( 'woocommerce_product_options_general_product_data', function () {
    global $product_object;
    /** @var WC_Product $product_object */
    woocommerce_wp_textarea_input( [
        'id'          => 'custom_data',
        'label'       => __( 'Custom Data', THEME_TEXTDOMAIN ),
        'value'       => $product_object->get_meta( 'custom_data' ),
    ] );
} );

add_action( 'woocommerce_process_product_meta', function ( $post_id ) {
    $product = wc_get_product( $post_id );
    $data    = isset( $_POST['custom_data'] ) ? $_POST['custom_data'] : '';
    $data    = wp_unslash( $data );
    $product->update_meta_data( 'custom_data', sanitize_text_field( $data ) );
    $product->save();
} );

и затем переделать функцию рендера контента вот так

function custom_tab_render_content() {
    global $product;
    if ( $product ) {
        echo $product->get_meta( 'custom_data' );
    }
}

Теперь текст, введенный в поле Custom Data, будет выводиться в новой табе.

Еще один момент – в данной реализации в поле Custom Data могут быть добавлены html-тэги, в том числе и <script>. Если этого нужно избежать, то тогда в ф-ции custom_tab_render_content нужно выводить контент таким способом

echo esc_html( $product->get_meta( 'custom_data' ) );

Если нужно чтоб работали шорткоды в отдельной табе, то вывод нужно обернуть в do_shortcode()

echo do_shortcode( $product->get_meta( 'custom_data' ) );

Чтобы поле “Custom Data” вывести в табе “Дополнительно”, нужно заменить хук woocommerce_product_options_general_product_data на woocommerce_product_options_advanced

Вам помог ответ?
Похожие вопросы
Как на мобильном "Меню в шапке" вывести под "Меню под шапкой"?
+8
Как вывести содержание поста (оглавление)?
+4
Как включить комментарии на страницах?
+4
Как добавить и настроить телефонные номера?
+38
Как вывести блок автора на странице записи?
+3
Как в рекламные блоки вставить код php?
+3
Как изменить тип миниатюры на странице записи?
+2
Как поменять названия вкладок (табов)
+2
Как добавить раздел блога в Bono
+2
Как вставить Instagram запись?
+2
Как добавить рандомное количество просмотров?
+2
Как перевести конструктор главной
+2
Как вывести соц. кнопки шаринга на странице записи?
+2
Как вывести рейтинг на странице записи?
+2
Как выровнять меню под шапкой по центру?
+19
Миниатюры неправильного размера (растянутые, квадратные, обрезанные и т.д.)
+18
Как убрать поле "Сайт" из формы комментирования?
+18
Как вывести рекламу на страницах?
+14
Как изменить поле telephone в микроразметке?
+13
Как изменить количество записей на главной и в рубриках блога
+12