dtdvlazd56637 2017-11-03 04:17
浏览 95
已采纳

带有Wysiwyg字段的元数据框显示在Woocommerce单个产品自定义选项卡上

Need to display a custom fields in the related products on a single product page.

I would like to add a meta box to the Add New Product fields and display results on custom tab on single product page under reviews.I tried using code but nothing shows on the page. Adding extra product tab helps me in adding extra information. So adding, saving and displaying product is what I am looking for.

add_filter( 'add_meta_boxes', 'bhww_core_cpt_metaboxes' );

function bhww_core_cpt_metaboxes( $meta_boxes ) {

    //global $prefix;
    $prefix = '_bhww_'; // Prefix for all fields

    // Add metaboxes to the 'Product' CPT
    $meta_boxes[] = array(
        'id'         => 'bhww_woo_tabs_metabox',
        'title'      => 'Additional Product Information - <strong>Optional</strong>',
        'pages'      => array( 'product' ), // Which post type to associate with?
        'context'    => 'normal',
        'priority'   => 'default',
        'show_names' => true,                   
        'fields'     => array(
            array(
                'name'    => __( 'Ingredients', 'cmb' ),
                'desc'    => __( 'Anything you enter here will be displayed on the Ingredients tab.', 'cmb' ),
                'id'      => $prefix . 'ingredients_wysiwyg',
                'type'    => 'wysiwyg',
                'options' => array( 'textarea_rows' => 5, ),
            ),
            array(
                'name'    => __( 'Benefits', 'cmb' ),
                'desc'    => __( 'Anything you enter here will be displayed on the Benefits tab.', 'cmb' ),
                'id'      => $prefix . 'benefits_wysiwyg',
                'type'    => 'wysiwyg',
                'options' => array( 'textarea_rows' => 5, ),
            ),
        ),
    );

    return $meta_boxes;

}

/////////////////////////////////////////

add_filter( 'woocommerce_product_data_tabs', 'bhww_woo_extra_tabs' );

function bhww_woo_extra_tabs( $tabs1 ) {

    global $post;
    $product_ingredients = get_post_meta( $post->ID, '_bhww_ingredients_wysiwyg', true );
    $product_benefits    = get_post_meta( $post->ID, '_bhww_benefits_wysiwyg', true );

    if ( ! empty( $product_ingredients ) ) {

        $tabs1['ingredients_tab'] = array(
            'title'    => __( 'Ingredients', 'woocommerce' ),
            'priority' => 15,
            'callback' => 'bhww_woo_ingredients_tab_content'
        );

    }

    if ( ! empty( $product_benefits ) ) {

        $tabs1['benefits_tab'] = array(
            'title'    => __( 'Benefits', 'woocommerce' ),
            'priority' => 16,
            'callback' => 'bhww_woo_benefits_tab_content'
        );

    }

    return $tabs1;

}

function bhww_woo_ingredients_tab_content() {

    global $post;
    $product_ingredients = get_post_meta( $post->ID, '_bhww_ingredients_wysiwyg', true );

    if ( ! empty( $product_ingredients ) ) {

        echo '<h2>' . esc_html__( 'Product Ingredients', 'woocommerce' ) . '</h2>';

        // Updated to apply the_content filter to WYSIWYG content
        echo apply_filters( 'the_content', $product_ingredients );

    }

}

function bhww_woo_benefits_tab_content() {

    global $post;
    $product_benefits = get_post_meta( $post->ID, '_bhww_benefits_wysiwyg', true );

    if ( ! empty( $product_benefits ) ) {

        echo '<h2>' . esc_html__( 'Product Benefits', 'woocommerce' ) . '</h2>';

        // Updated to apply the_content filter to WYSIWYG content
        echo apply_filters( 'the_content', $product_benefits );

    }

}

back end requirement

  • 写回答

1条回答 默认 最新

  • duan4369 2017-11-06 22:41
    关注

    Here is the way to add your 2 custom fields (editor wysiwyg) in Admin edit product pages and display the values in front-end single product pages custom tabs:

    ## ---- 1. Backend ---- ##
    
    // Adding a custom Meta container to admin products pages
    add_action( 'add_meta_boxes', 'create_custom_meta_box' );
    if ( ! function_exists( 'create_custom_meta_box' ) )
    {
        function create_custom_meta_box()
        {
            add_meta_box(
                'custom_product_meta_box',
                __( 'Additional Product Information <em>(optional)</em>', 'cmb' ),
                'add_custom_content_meta_box',
                'product',
                'normal',
                'default'
            );
        }
    }
    
    //  Custom metabox content in admin product pages
    if ( ! function_exists( 'add_custom_content_meta_box' ) ){
        function add_custom_content_meta_box( $post ){
            $prefix = '_bhww_'; // global $prefix;
    
            $ingredients = get_post_meta($post->ID, $prefix.'ingredients_wysiwyg', true) ? get_post_meta($post->ID, $prefix.'ingredients_wysiwyg', true) : '';
            $benefits = get_post_meta($post->ID, $prefix.'benefits_wysiwyg', true) ? get_post_meta($post->ID, $prefix.'benefits_wysiwyg', true) : '';
            $args['textarea_rows'] = 6;
    
            echo '<p>'.__( 'Ingredients', 'cmb' ).'</p>';
            wp_editor( $ingredients, 'ingredients_wysiwyg', $args );
    
            echo '<p>'.__( 'Benefits', 'cmb' ).'</p>';
            wp_editor( $benefits, 'benefits_wysiwyg', $args );
    
            echo '<input type="hidden" name="custom_product_field_nonce" value="' . wp_create_nonce() . '">';
        }
    }
    
    
    
    //Save the data of the Meta field
    add_action( 'save_post', 'save_custom_content_meta_box', 10, 1 );
    if ( ! function_exists( 'save_custom_content_meta_box' ) )
    {
    
        function save_custom_content_meta_box( $post_id ) {
            $prefix = '_bhww_'; // global $prefix;
    
            // We need to verify this with the proper authorization (security stuff).
    
            // Check if our nonce is set.
            if ( ! isset( $_POST[ 'custom_product_field_nonce' ] ) ) {
                return $post_id;
            }
            $nonce = $_REQUEST[ 'custom_product_field_nonce' ];
    
            //Verify that the nonce is valid.
            if ( ! wp_verify_nonce( $nonce ) ) {
                return $post_id;
            }
    
            // If this is an autosave, our form has not been submitted, so we don't want to do anything.
            if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
                return $post_id;
            }
    
            // Check the user's permissions.
            if ( 'product' == $_POST[ 'post_type' ] ){
                if ( ! current_user_can( 'edit_product', $post_id ) )
                    return $post_id;
            } else {
                if ( ! current_user_can( 'edit_post', $post_id ) )
                    return $post_id;
            }
    
            // Sanitize user input and update the meta field in the database.
            update_post_meta( $post_id, $prefix.'ingredients_wysiwyg', wp_kses_post($_POST[ 'ingredients_wysiwyg' ]) );
            update_post_meta( $post_id, $prefix.'benefits_wysiwyg', wp_kses_post($_POST[ 'benefits_wysiwyg' ]) );
        }
    }
    
    ## ---- 2. Front-end ---- ##
    
    // Create custom tabs in product single pages
    add_filter( 'woocommerce_product_tabs', 'custom_product_tabs' );
    function custom_product_tabs( $tabs ) {
        global $post;
    
        $product_ingredients = get_post_meta( $post->ID, '_bhww_ingredients_wysiwyg', true );
        $product_benefits    = get_post_meta( $post->ID, '_bhww_benefits_wysiwyg', true );
    
        if ( ! empty( $product_ingredients ) )
            $tabs['ingredients_tab'] = array(
                'title'    => __( 'Ingredients', 'woocommerce' ),
                'priority' => 45,
                'callback' => 'ingredients_product_tab_content'
            );
    
        if ( ! empty( $product_benefits ) )
            $tabs['benefits_tab'] = array(
                'title'    => __( 'Benefits', 'woocommerce' ),
                'priority' => 50,
                'callback' => 'benefits_product_tab_content'
            );
    
        return $tabs;
    }
    
    // Add content to custom tab in product single pages (1)
    function ingredients_product_tab_content() {
        global $post;
    
        $product_ingredients = get_post_meta( $post->ID, '_bhww_ingredients_wysiwyg', true );
    
        if ( ! empty( $product_ingredients ) ) {
            echo '<h2>' . __( 'Product Ingredients', 'woocommerce' ) . '</h2>';
    
            // Updated to apply the_content filter to WYSIWYG content
            echo apply_filters( 'the_content', $product_ingredients );
        }
    }
    
    // Add content to custom tab in product single pages (2)
    function benefits_product_tab_content() {
        global $post;
    
        $product_benefits = get_post_meta( $post->ID, '_bhww_benefits_wysiwyg', true );
    
        if ( ! empty( $product_benefits ) ) {
            echo '<h2>' . __( 'Product Benefits', 'woocommerce' ) . '</h2>';
    
            // Updated to apply the_content filter to WYSIWYG content
            echo apply_filters( 'the_content', $product_benefits );
        }
    }
    

    Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

    Tested and works. You will get:

    1) In backend:

    enter image description here

    2) In Front-end:

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?