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

时间:2016-07-15 19:11:07

标签: php wordpress woocommerce categories advanced-custom-fields

我有一个显示分类产品的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 );

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

欢迎任何建议,因为我已经在这几周了,只是在寻找解决方案。

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

在下面的代码片段中,我们创建了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个自定义字段及相应的值:

enter image description here

  

此代码使用自WordPress 4.4+ (更好)以来包含的更多近期函数,而不是通常在大多数其他相关线程上找到的函数:get_term_meta()update_term_meta()

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

非常好的参考(使用新的核心功能):Add custom field to Category