WooCommerce 产品类别自定义字段 - 设置时间购买限制

WooCommerce product categories custom fields - Setting time purchasing restrictions

我有一个显示分类产品的 Wordpress/WooCommerce 网站。我正在尝试在管理个人类别页面(后端)中创建自定义字段,我可以在其中设置 startend time 与分类产品购买可用性相关。

这应该如何工作:
客户只能购买类别为 "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 );

此代码在管理类别页面中添加了一个自定义字段,但正如我之前所说,我正在寻找一个可以设置开始和结束时间的自定义字段。

欢迎提出任何建议,因为我已经研究了数周,只是在寻找解决方案。

提前致谢。

关于产品类别的时间可用性,我选择添加3个自定义选择器:

  • 一个用于启用功能,
  • 开始时间一个
  • 持续时间(期间):

在下面的代码片段中,我们创建了 3 个 editable 自定义字段 (代码非常紧凑,因为我使用了 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 table,您将看到您的类别 ID (这里是 ID 11 when testing) 3个自定义字段对应的值:

This code is using more recent functions included since WordPress 4.4+ (Much better) than found usually on most other related threads: get_term_meta() and update_term_meta()

所有这些代码都经过测试并且功能齐全。它位于您的活动子主题或主题中的 function.php 文件中。

很好的参考(使用新的核心函数):Add custom field to Category