将 Woocommerce 预购选项卡添加到我的自定义产品类型
Add Woocommerce Pre-Order Tab to my custom Product type
我希望 Woocommerce 预购插件将其自身添加到我创建的自定义产品类型中。如果我选择 Woocommerce 标准产品类型,我会得到一个预购标签。
是否有一个钩子可以将我的 "custom product type" 传递给插件,以便它知道它应该可见?
我已遵循此指南:http://jeroensormani.com/adding-a-custom-woocommerce-product-type/ 实际添加了自定义产品并且它有效。
我没有代码示例,因为我不知道如何做到这一点。
EDIT #1 - User wanted to have reference code from the plugin .
这取自 "class-wc-pre-orders-admin.php"
/** product hooks */
// add 'Pre-Orders' product writepanel tab
add_action( 'woocommerce_product_write_panel_tabs', array( $this, 'add_product_tab' ), 11 );
// Add 'Pre-Orders' tab content
add_action( 'woocommerce_product_write_panels', array( $this, 'add_product_tab_options' ), 11 );
/** Functions **/
<?php
/**
* Add 'Pre-Orders' tab to product writepanel
*
* @since 1.0
*/
public function add_product_tab() {
?>
<li class="wc_pre_orders_tab wc_pre_orders_options">
<a href="#wc_pre_orders_data"><?php _e( 'Pre-Orders', WC_Pre_Orders::TEXT_DOMAIN ); ?></a>
</li>
<?php
}
找不到他们过滤选项卡的位置,只需将其添加到打印的数组中即可。
目前我没有挂机过滤器"product_data_tabs"
EDIT #2 - Added my code .
/* STEP 1 */
function register_simple_custom_product_type() {
class WC_Product_Simple_Custom_Product extends WC_Product_Simple {
public function __construct( $product ) {
$this->product_type = 'simple_custom';
parent::__construct( $product );
}
}
}
add_action( 'init', 'register_simple_custom_product_type' );
/* STEP 2 */
function add_simple_custom_product( $types ){
$types[ 'simple_custom' ] = __( 'Simple custom' );
return $types;
}
add_filter( 'product_type_selector', 'add_simple_custom_product' );
/* STEP 3*/
function custom_product_tabs( $tabs) {
$tabs['custom'] = array(
'label' => __( 'Custom', 'woocommerce' ),
'target' => 'custom_options',
'class' => array( 'show_if_simple_custom', 'show_if_variable_custom' ),
);
/* filter to show pre_order tab with this product-type */
tabs['pre_order']['class'][] = 'show_if_simple_custom show_if_variable_custom';
return $tabs;
}
add_filter( 'woocommerce_product_data_tabs', 'custom_product_tabs' );
但事实并非如此。
显示一个名为 Custom 的新标签。
当我在下拉字段中 select 简单自定义作为产品类型时显示预购选项卡。
EDIT #3 .
正确答案已标记,这里是 link 更正代码 http://pastebin.com/GM1UmDwC
这不是挂钩,而是 javascript,它控制在您更改产品类型时什么是可见的,什么是不可见的。我现在无法访问预购插件,但是,如果您为 pre-order 选项卡找到正确的 class,那么这些内容应该会起作用。
jQuery( function($){
$( 'body' ).on( 'woocommerce-product-type-change', function( event, select_val, select ) {
if ( select_val === 'your-product-type' ) {
// modify to an actual CSS class selector
$( '.some-class-selector-for-pre-order-tab' ).show();
}
} );
$( 'select#product-type' ).change();
} );
或者,添加 'show-if-PRODUCT-TYPE' 可能更有效(其中 PRODUCT-TYPE 需要替换为 <select>
元素中您的产品类型的值)class 到 pre-order 选项卡。如果记忆服务,那么 WooCommerce 会在产品类型更改时自动显示它。
jQuery( function($){
$( '.some-class-selector-for-pre-order-tab' ).add_class( 'show-if-YOUR-PRODUCT-TYPE' );
$( 'select#product-type' ).change();
} );
编辑#1
我忘了过滤选项卡 classes!这可能更简单,并且不需要任何额外的脚本,因为使用正确的 classes,WooCommerce 将自动处理来自它自己的脚本的 hide/show。您必须已经对此进行过滤以添加到您自己的自定义选项卡中,但同时您可以调整其他选项卡。
这是一个示例,直到我可以看到更多您的代码并可以进行相应的编辑以进行匹配。
**
* Add a custom product tab.
*/
function custom_product_tabs( $tabs) {
// This is where you register your product type's tab.
$tabs['rental'] = array(
'label' => __( 'Rental', 'your-plugin-textdomain' ),
'target' => 'rental_options',
'class' => array( 'show_if_simple_rental' ),
);
// Add an additional class to an existing tab, ex: Inventory.
$tabs[ 'inventory' ][ 'class' ][] = 'show_if_simple_rental';
return $tabs;
}
add_filter( 'woocommerce_product_data_tabs', 'custom_product_tabs' );
编辑#2
因为 Pre Orders 是通过 woocommerce_product_write_panel_tabs
操作挂钩而不是通过 woocommerce_product_data_tabs
过滤器添加他们的选项卡,所以我之前的编辑将不起作用。 Pre-Orders 然后使用它自己的脚本来切换可见性,您不想处理脚本的优先级。事实证明 Pre-Orders 具有获取其支持的产品类型的功能,您可以通过其 wc_pre_orders_supported_product_types
过滤器添加自己的类型:
function so_42253729_add_pre_order_support( $types ){
$types[] = 'your-product-type';
return $types;
}
add_filter( 'wc_pre_orders_supported_product_types', 'so_42253729_add_pre_order_support' );
我希望 Woocommerce 预购插件将其自身添加到我创建的自定义产品类型中。如果我选择 Woocommerce 标准产品类型,我会得到一个预购标签。
是否有一个钩子可以将我的 "custom product type" 传递给插件,以便它知道它应该可见?
我已遵循此指南:http://jeroensormani.com/adding-a-custom-woocommerce-product-type/ 实际添加了自定义产品并且它有效。
我没有代码示例,因为我不知道如何做到这一点。
EDIT #1 - User wanted to have reference code from the plugin .
这取自 "class-wc-pre-orders-admin.php"
/** product hooks */
// add 'Pre-Orders' product writepanel tab
add_action( 'woocommerce_product_write_panel_tabs', array( $this, 'add_product_tab' ), 11 );
// Add 'Pre-Orders' tab content
add_action( 'woocommerce_product_write_panels', array( $this, 'add_product_tab_options' ), 11 );
/** Functions **/
<?php
/**
* Add 'Pre-Orders' tab to product writepanel
*
* @since 1.0
*/
public function add_product_tab() {
?>
<li class="wc_pre_orders_tab wc_pre_orders_options">
<a href="#wc_pre_orders_data"><?php _e( 'Pre-Orders', WC_Pre_Orders::TEXT_DOMAIN ); ?></a>
</li>
<?php
}
找不到他们过滤选项卡的位置,只需将其添加到打印的数组中即可。
目前我没有挂机过滤器"product_data_tabs"
EDIT #2 - Added my code .
/* STEP 1 */
function register_simple_custom_product_type() {
class WC_Product_Simple_Custom_Product extends WC_Product_Simple {
public function __construct( $product ) {
$this->product_type = 'simple_custom';
parent::__construct( $product );
}
}
}
add_action( 'init', 'register_simple_custom_product_type' );
/* STEP 2 */
function add_simple_custom_product( $types ){
$types[ 'simple_custom' ] = __( 'Simple custom' );
return $types;
}
add_filter( 'product_type_selector', 'add_simple_custom_product' );
/* STEP 3*/
function custom_product_tabs( $tabs) {
$tabs['custom'] = array(
'label' => __( 'Custom', 'woocommerce' ),
'target' => 'custom_options',
'class' => array( 'show_if_simple_custom', 'show_if_variable_custom' ),
);
/* filter to show pre_order tab with this product-type */
tabs['pre_order']['class'][] = 'show_if_simple_custom show_if_variable_custom';
return $tabs;
}
add_filter( 'woocommerce_product_data_tabs', 'custom_product_tabs' );
但事实并非如此。
显示一个名为 Custom 的新标签。
当我在下拉字段中 select 简单自定义作为产品类型时显示预购选项卡。
EDIT #3 .
正确答案已标记,这里是 link 更正代码 http://pastebin.com/GM1UmDwC
这不是挂钩,而是 javascript,它控制在您更改产品类型时什么是可见的,什么是不可见的。我现在无法访问预购插件,但是,如果您为 pre-order 选项卡找到正确的 class,那么这些内容应该会起作用。
jQuery( function($){
$( 'body' ).on( 'woocommerce-product-type-change', function( event, select_val, select ) {
if ( select_val === 'your-product-type' ) {
// modify to an actual CSS class selector
$( '.some-class-selector-for-pre-order-tab' ).show();
}
} );
$( 'select#product-type' ).change();
} );
或者,添加 'show-if-PRODUCT-TYPE' 可能更有效(其中 PRODUCT-TYPE 需要替换为 <select>
元素中您的产品类型的值)class 到 pre-order 选项卡。如果记忆服务,那么 WooCommerce 会在产品类型更改时自动显示它。
jQuery( function($){
$( '.some-class-selector-for-pre-order-tab' ).add_class( 'show-if-YOUR-PRODUCT-TYPE' );
$( 'select#product-type' ).change();
} );
编辑#1
我忘了过滤选项卡 classes!这可能更简单,并且不需要任何额外的脚本,因为使用正确的 classes,WooCommerce 将自动处理来自它自己的脚本的 hide/show。您必须已经对此进行过滤以添加到您自己的自定义选项卡中,但同时您可以调整其他选项卡。
这是一个示例,直到我可以看到更多您的代码并可以进行相应的编辑以进行匹配。
**
* Add a custom product tab.
*/
function custom_product_tabs( $tabs) {
// This is where you register your product type's tab.
$tabs['rental'] = array(
'label' => __( 'Rental', 'your-plugin-textdomain' ),
'target' => 'rental_options',
'class' => array( 'show_if_simple_rental' ),
);
// Add an additional class to an existing tab, ex: Inventory.
$tabs[ 'inventory' ][ 'class' ][] = 'show_if_simple_rental';
return $tabs;
}
add_filter( 'woocommerce_product_data_tabs', 'custom_product_tabs' );
编辑#2
因为 Pre Orders 是通过 woocommerce_product_write_panel_tabs
操作挂钩而不是通过 woocommerce_product_data_tabs
过滤器添加他们的选项卡,所以我之前的编辑将不起作用。 Pre-Orders 然后使用它自己的脚本来切换可见性,您不想处理脚本的优先级。事实证明 Pre-Orders 具有获取其支持的产品类型的功能,您可以通过其 wc_pre_orders_supported_product_types
过滤器添加自己的类型:
function so_42253729_add_pre_order_support( $types ){
$types[] = 'your-product-type';
return $types;
}
add_filter( 'wc_pre_orders_supported_product_types', 'so_42253729_add_pre_order_support' );