我有一个显示分类产品的Wordpress / WooCommerce网站。我尝试在管理员个人类别页面(后端)中创建自定义字段,我可以在其中设置开始和结束 时间与分类产品购买可用性相关。
这应该如何运作:
客户只能购买类别为" open" (在此类别的开始和结束时间之间),但即使不可购买,所有产品仍然可见。
我想知道是否有人知道开始实现这一目标的最佳方式。
目前这里是我的相关代码:
function custom_product_taxonomy_add_new_meta_field() { //add term page
//this will add the custom meta field to the add new term page
?>
<div class="form-field">
<label for="term_meta[custom_term_meta]"><?php _e( 'Post Code(s)' ); ?></label>
<input type="text" name="term_meta[custom_term_meta]" id="term_meta[custom_term_meta]" value="">
<p class="description"><?php _e( 'Enter the delivery post codes available for this store.','my-text-domain' ); ?></p>
</div>
<?php
}
add_action( 'product_cat_add_form_fields', 'custom_product_taxonomy_add_new_meta_field', 10, 2 );
//edit term page
function custom_product_taxonomy_edit_meta_field($term) {
//put the term ID into a variable
$t_id = $term->term_id;
//retrieve the existing value(s) for this meta field. This returns an array
$term_meta = get_option( "taxonomy_$t_id" ); ?>
<tr class="form-field">
<th scope="row" valign="top"><label for="term_meta[custom_term_meta]"><?php _e( 'Post Code(s)' ); ?></label></th>
<td>
<input type="text" name="term_meta[custom_term_meta]" id="term_meta[custom_term_meta]" value="<?php echo esc_attr( $term_meta['custom_term_meta'] ) ? esc_attr( $term_meta['custom_term_meta'] ) : ''; ?>">
<p class="description"><?php _e( 'Enter the delivery post codes available for this store.' ); ?></p>
</td>
</tr>
<?php
}
add_action( 'product_cat_edit_form_fields', 'custom_product_taxonomy_edit_meta_field', 10, 2 );
//save extra taxonomy fields callback function.
function save_taxonomy_custom_meta( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
$t_id = $term_id;
$term_meta = get_option( "taxonomy_$t_id" );
$cat_keys = array_keys( $_POST['term_meta'] );
foreach ( $cat_keys as $key ) {
if ( isset ( $_POST['term_meta'][$key] ) ) {
$term_meta[$key] = $_POST['term_meta'][$key];
}
}
update_option( "taxonomy_$t_id", $term_meta ); //save the option array.
}
}
add_action( 'edited_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
此代码在管理员类别页面中添加了自定义字段,但正如我之前所说,我正在寻找一个自定义字段,我可以设置开始和结束时间。
欢迎任何建议,因为我已经在这几周了,只是在寻找解决方案。
提前致谢。
答案 0 :(得分:1)
关于产品类别的时间可用性,我选择添加3个自定义选择器:
在下面的代码片段中,我们创建了3个可编辑的自定义字段(代码非常紧凑,因为我使用 for
循环来生成小时选择器选项,而不是显示24小时选项......):
add_action( 'product_cat_edit_form_fields', 'availiability_product_taxonomy_edit_meta_field', 10, 2 );
add_action( 'product_cat_add_form_fields', 'availiability_product_taxonomy_edit_meta_field', 10, 2 );
function availiability_product_taxonomy_edit_meta_field($term) {
//put the term ID into a variable
$term_id = $term->term_id;
//retrieve the start and ends values
$enable_time = get_term_meta( $term_id, 'enable_time', true ) == '1' ? '1' : '0';
$start_time = get_term_meta( $term_id, 'start_time', true );
$lenght_time = get_term_meta( $term_id, 'lenght_time', true );
?>
<tr class="form-field">
<th scope="row" valign="top">
<label for="time-availiability"><?php _e( 'Time availiability' ,'my-theme-slug' ); ?></label>
</th>
<td>
<span style="padding-right:8px">
<label style="padding-right:8px" for="enable_time"><b><?php _e( 'Hours: ' ,'my-theme-slug' ); ?></b></label>
<select name="enable_time" id="enable_time" class="postform">
<option <?php if ( $enable_time == '0') echo 'selected'; ?> value='0'><?php _e( 'Disabled' ,'my-theme-slug' ); ?></option>
<option <?php if ( $enable_time == '1') echo 'selected'; ?> value='1'><?php _e( 'Enabled' ,'my-theme-slug' ); ?></option>
</select>
</span>
<span style="padding-right:10px">
<label for="start_time"><?php _e( "Start" ,"my-theme-slug" ); ?></label>
<select name="start_time" id="start_time" class="postform">
<?php // Genereting the 24 options tags
for ($i = 0; $i < 24; $i++) {
$j = $i < 10 ? '0'.$i : ''.$i ; // values with on 2 digits
$selected = $start_time == $j ? "selected" : "";
?>
<option <?php echo $selected; ?> value="<?php echo $j; ?>"><?php echo $j; ?></option>
<?php } ?>
</select>
</span>
<span>
<label for="lenght_time"><?php _e( "Length" ,"my-theme-slug" ); ?></label>
<select name="lenght_time" id="lenght_time" class="postform">
<?php // Genereting the 24 options tags
for ($i = 0; $i < 25; $i++) {
$j = $i < 10 ? '0'.$i : ''.$i ; // values with on 2 digits
$selected = $lenght_time == $j ? "selected" : "";
?>
<option <?php echo $selected; ?> value="<?php echo $j; ?>"><?php echo $j; ?></option>
<?php } ?>
</select>
</span>
</td>
</tr>
<?php
}
然后,在下面的代码段中,我们会在提交时保存自定义字段数据。
add_action( 'create_product_cat', 'availiability_taxonomy_custom_meta', 10, 2 );
add_action( 'edited_product_cat', 'availiability_taxonomy_custom_meta', 10, 2 );
function availiability_taxonomy_custom_meta( $term_id ) {
if ( isset( $_POST['enable_time'] ) ) {
update_term_meta ($term_id, 'enable_time', $_POST['enable_time'] );
}
if ( isset( $_POST['start_time'] ) ) {
update_term_meta ($term_id, 'start_time', $_POST['start_time'] );
}
if ( isset( $_POST['lenght_time'] ) ) {
update_term_meta ($term_id, 'lenght_time', $_POST['lenght_time'] );
}
}
如果您在 wp_termmeta
表格中查看数据库,则会看到您的类别ID (此处为 ID 11
在测试时) 3个自定义字段及相应的值:
此代码使用自WordPress 4.4+ (更好)以来包含的更多近期函数,而不是通常在大多数其他相关线程上找到的函数:get_term_meta()和update_term_meta()
所有这些代码都经过测试并且功能齐全。它位于活动子主题或主题中的function.php文件中。
非常好的参考(使用新的核心功能):Add custom field to Category