2

У меня есть сайт Wordpress/WooCommerce, в котором отображаются категоризированные продукты. Я пытаюсь создать настраиваемое поле в разделе «Администрирование отдельных категорий» (бэкэнд), где я могу установить начало и конецвремя, связанное с наличием доступной категории товаров.Категории товаров пользовательских полей WooCommerce - Ограничения на время покупки

Как это должно работать:
Клиенты могли приобрести только продукты, категория «открыта» (между начальным и конечным временем, установленным в этой категории), но все продукты будут все еще видны, даже если они не продажный.

Мне было интересно, есть ли у кого-то представление о наилучшем способе начать и добиться этого.

На данный момент здесь находится соответствующий код, который у меня есть:

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

Что касается времени доступности категорий продуктов, я решил добавить 3 пользовательских селекторов:

  • один для включения функции,
  • один для времени начала
  • один на срок (период):

enter image description here

В коде Snippe т ниже, мы создаем что 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()

Всего этот код проверен и полностью работоспособен. Он находится в файле functions.php, расположенном в вашей активной дочерней теме или теме.

очень хорошая ссылка (используя новые основные функции): Add custom field to Category

+0

А-М-A-Z-I-N-G! Это невероятно хорошо! Спасибо, ацтек! –

Смежные вопросы