php 如何定义自定义产品类型的字段- Woo Commerce Hook

t98cgbkg  于 2022-12-17  发布在  PHP
关注(0)|答案(5)|浏览(167)

我的代码显示在所有产品类型,如简单产品,可变产品,自定义类型......字段。意味着可用于所有,但我想限制它为我的自定义类型。
如何将自定义字段类型限制为英语课程产品类型

add_filter( 'product_type_selector', 'english_course_wc_cpt' );
function english_course_wc_cpt( $types ){
$types[ 'wdm_custom_product' ] = __( 'English Courses' );
return $types;
}

class WC_Product_Wdm extends WC_Product{
public function __construct( $product ) {
    $this->product_type = 'wdm_custom_product';
    parent::__construct( $product );
    // add additional functions here
    }
}

add_action( 'woocommerce_product_options_general_product_data', 'english_course_custom_fields' );
function english_course_custom_fields() {
global $woocommerce, $post;

echo '<div class="options_group">';
 // Duration: Duration of the course
woocommerce_wp_text_input(
  array(
   'id'                => 'duration_ec_wc_cpt',
   'label'             => __( 'Duration', 'woocommerce' ),
   'placeholder'       => 'Enter the Duration of the Course',
   'desc_tip'    => 'true',
   'description'       => __( 'Duration of the Course.', 'woocommerce' ),
   'type'              => 'text'
   ));

// Fee: Create a number field 
woocommerce_wp_text_input(
  array(
   'id'                => 'fee_ec_wc_cpt',
   'label'             => __( 'Fee', 'woocommerce' ),
   'placeholder'       => 'Enter the Fee',
   'desc_tip'    => 'true',
   'description'       => __( 'Fee of the course.', 'woocommerce' ),
   'type'              => 'number'
   ));

// Address: Create a text area field 
woocommerce_wp_textarea_input(
  array(
   'id'                => 'address_ec_wc_cpt',
   'label'             => __( 'Address', 'woocommerce' ),
   'placeholder'       => 'Enter the Address',
   'desc_tip'    => 'true',
   'description'       => __( 'Address of the course.', 'woocommerce' ),
   )); 

echo '</div>';
}

/*
     *   SAVING DATA - ENGLISH COURSES (wc_cpt)
 *   postfix/prefix : ec_wc_cpt
 */
add_action( 'woocommerce_process_product_meta', 'save_ec_wc_cpt' );
function save_ec_wc_cpt( $post_id ){
// Save Duration field
$duration_ec_wc_cpt = $_POST['duration_ec_wc_cpt'];
if( !empty( $duration_ec_wc_cpt ) )
update_post_meta( $post_id, 'duration_ec_wc_cpt', esc_attr( $duration_ec_wc_cpt) );

// Save Fee field
$fee_ec_wc_cpt = $_POST['fee_ec_wc_cpt'];
if( !empty( $fee_ec_wc_cpt ) )
update_post_meta( $post_id, 'fee_ec_wc_cpt', esc_attr( $fee_ec_wc_cpt) );

// Save Address field
$address_ec_wc_cpt = $_POST['address_ec_wc_cpt'];
if( !empty( $fee_ec_wc_cpt ) )
update_post_meta( $post_id, 'address_ec_wc_cpt', esc_attr( $address_ec_wc_cpt) );

}
bttbmeg0

bttbmeg01#

我认为有两种方法可以做到这一点。1。要么添加自定义字段到自己的窗格中的产品数据框。或2。继续添加他们到通用数据挂钩您正在使用,然后使用JS隐藏他们的其他产品类型。

方法1

// Creates the admin panel tab
add_action( 'woocommerce_product_write_panel_tabs', 'so_26338834_product_write_panel_tab' );

function so_26338834_product_write_panel_tab() {
    echo '<li class="wdm_custom_product_tab show_if_wdm_custom_product wdm_custom_product_options"><a href="#wdm_custom_product_data">'.__( 'English Courses' ).'</a></li>';
}

// Creates the panel for selecting product options
add_action( 'woocommerce_product_write_panels', 'so_26338834_product_write_panel' );

function so_26338834_product_write_panel() {
    global $post; ?>

    <div id="wdm_custom_product_data" class="wdm_custom_product panel panel woocommerce_options_panel wc-metaboxes-wrapper">

        <div class="options_group wdm_custom_product">
        put your fields here
        </div> <!-- options group -->

    </div>

<?php
}

方法2

show_if_{$product_type}类将您的输入 Package 在一个div中。我 * 认为 * WooCommerce将为您处理隐藏/显示方面。

add_action( 'woocommerce_product_options_general_product_data', 'english_course_custom_fields' );
function english_course_custom_fields() {
global $woocommerce, $post;

echo '<div class="options_group show_if_wdm_custom_product">';
// your inputs
echo '</div>';
}

编辑:我检查了我自己的代码,发现您必须编写隐藏/显示自己的javascript。这很容易做到,因为当产品类型输入发生变化时,WooCommerce会触发一个自定义事件,所以我们可以编写一个处理程序来触发这个事件。

// product type specific options
$( 'body' ).on( 'woocommerce-product-type-change', function( event, select_val, select ) {

    if ( select_val == 'wdm_custom_product' ) {
        $( '.show_if_wdm_custom_product' ).show();
    } else {
        $( '.show_if_wdm_custom_product' ).hide();
    }
});
68bkxrlz

68bkxrlz2#

添加自定义 meta框,然后向元框中添加字段

/**
* adding custom box to show custom fields in product create/edit page
*/
 function add_custom_meta_box() {
        add_meta_box(
            'custom_meta_box', // $id
            'Deal of Day', // $title
            'show_custom_meta_box', // $callback
            'product', // $page  ( or content type)
            'normal', // $context
            'high');// $priority
    }

/*
 * call back functio to render fields in meta box
 */
function show_custom_meta_box() {
        global $post;
        $meta = get_post_meta($post->ID, $field['id'], true);
        echo '<input type="text" name="name-of-field" id="field-od" value="' . $meta . '" size="30" />
                                <br /><span class="description">Label</span>';
}

add_action('add_meta_boxes',  'add_custom_meta_box' );
ac1kyiln

ac1kyiln3#

您可以使用woocommerce_product_options_general_product_data操作挂钩添加自定义字段到特定的产品类型和woocommerce_process_product_meta过滤器挂钩保存自定义字段。有关详细信息,请参阅链接-http://wisdmlabs.com/blog/create-product-type-custom-settings-woocommerce/。这将帮助您。

ht4b089n

ht4b089n4#

1.在Woocommerce中创建自定义产品类别;就叫它Custom Product
1.将以下代码添加到functions.php:

function isCustomProduct($pid) {
    $terms = get_the_terms( $id, 'product_cat' );
    foreach ($terms as $term) {
        if ($term->name == 'Custom Product') {
            return true;
        }
    }
    return false;
}

1.将以下行添加到english_course_custom_fields()的开头:

if (!isWyDayProduct($post->ID)) {
    return;
}
czfnxgou

czfnxgou5#

您应该创建一个新文件并将类放入其中。

class WC_Product_Wdm extends WC_Product
{
    require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/wp-config.php';
public function __construct( $product ) {
    $this->product_type = 'wdm_custom_product';
    parent::__construct( $product );
    // add additional functions here
    }
}

并在另一个文件中传递其他函数。然后将类放在文件的开头

require_once class.php';
add_filter( 'product_type_selector', 'english_course_wc_cpt' );
function english_course_wc_cpt( $types ){
$types[ 'wdm_custom_product' ] = __( 'English Courses' );
return $types;
}



add_action( 'woocommerce_product_options_general_product_data', 'english_course_custom_fields' );
function english_course_custom_fields() {
global $woocommerce, $post;

echo '<div class="options_group">';
 // Duration: Duration of the course
woocommerce_wp_text_input(
  array(
   'id'                => 'duration_ec_wc_cpt',
   'label'             => __( 'Duration', 'woocommerce' ),
   'placeholder'       => 'Enter the Duration of the Course',
   'desc_tip'    => 'true',
   'description'       => __( 'Duration of the Course.', 'woocommerce' ),
   'type'              => 'text'
   ));

// Fee: Create a number field 
woocommerce_wp_text_input(
  array(
   'id'                => 'fee_ec_wc_cpt',
   'label'             => __( 'Fee', 'woocommerce' ),
   'placeholder'       => 'Enter the Fee',
   'desc_tip'    => 'true',
   'description'       => __( 'Fee of the course.', 'woocommerce' ),
   'type'              => 'number'
   ));

// Address: Create a text area field 
woocommerce_wp_textarea_input(
  array(
   'id'                => 'address_ec_wc_cpt',
   'label'             => __( 'Address', 'woocommerce' ),
   'placeholder'       => 'Enter the Address',
   'desc_tip'    => 'true',
   'description'       => __( 'Address of the course.', 'woocommerce' ),
   )); 

echo '</div>';
}

/*
     *   SAVING DATA - ENGLISH COURSES (wc_cpt)
 *   postfix/prefix : ec_wc_cpt
 */
add_action( 'woocommerce_process_product_meta', 'save_ec_wc_cpt' );
function save_ec_wc_cpt( $post_id ){
// Save Duration field
$duration_ec_wc_cpt = $_POST['duration_ec_wc_cpt'];
if( !empty( $duration_ec_wc_cpt ) )
update_post_meta( $post_id, 'duration_ec_wc_cpt', esc_attr( $duration_ec_wc_cpt) );

// Save Fee field
$fee_ec_wc_cpt = $_POST['fee_ec_wc_cpt'];
if( !empty( $fee_ec_wc_cpt ) )
update_post_meta( $post_id, 'fee_ec_wc_cpt', esc_attr( $fee_ec_wc_cpt) );

// Save Address field
$address_ec_wc_cpt = $_POST['address_ec_wc_cpt'];
if( !empty( $fee_ec_wc_cpt ) )
update_post_meta( $post_id, 'address_ec_wc_cpt', esc_attr( $address_ec_wc_cpt) );

}

相关问题