【问题标题】:WooCommerce product categories custom fields - Setting time purchasing restrictionsWooCommerce 产品类别自定义字段 - 设置时间购买限制
【发布时间】:2016-11-19 02:27:01
【问题描述】:

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

这应该如何工作:
客户只能购买类别为“开放”的产品(在设置为此类别的开始和结束时间之间),但所有产品即使不可购买也仍然可见。

我想知道是否有人知道开始和实现它的最佳方式。

目前这里是我拥有的相关代码:

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 );

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

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    在下面的代码 sn-p 中,我们创建了 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
    }
    

    然后在下面的代码sn-p中我们保存提交时的自定义字段数据。

    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

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 2019-01-27
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多