В приведенном выше коде не хватает нескольких вещей.
- Хук, который вы использовали в первой строке, не существует. Правый хук называется
woocommerce_product_options_related
.
- Код, в котором вы создали свое настраиваемое поле, не находится внутри какой-либо функции.
- Вы создаете стандартное текстовое поле. Если вам нужен раскрывающийся список «Выбрать продукт», следует использовать другой подход. Это должно быть внутри той функции, которую вы используете в хуке.
- Вам не хватает крючка и функции, которая фактически сохраняет данные из вашего настраиваемого поля.
1. Поиск правильного зацепа / действия
Чтобы найти подходящий перехватчик, просто найдите woocommerce_product_options_ внутри плагина WoocCommerce, и должно появиться около 6 PHP-файлов. Один из этих файлов называется html-product-data-connected-products.php. Этот файл содержит все существующие параметры в этом конкретном разделе WooCommerce. Он также содержит ловушку, используемую для отображения этих опций.
Откройте файл и проверьте его. Крючок находится внизу страницы
Полный путь: / wp-content / plugins / woocommerce / includes / admin / metaboxes / views /
2. Создание раскрывающегося списка
Чтобы создать раскрывающийся список, включающий поиск продукта, вам понадобится код, сильно отличающийся от приведенного выше.
В свободное время вы можете просто скопировать и вставить один из существующих параметров в файл, упомянутый выше, а затем изменить его в соответствии с вашими потребностями.
Все это должно быть помещено в функцию с именем: woocom_linked_products_data_custom_field()
.
2.1. Измените идентификатор / имя
Первое, что вам нужно изменить в коде, это, конечно, уникальный идентификатор / имя поля. Он помещается в тег label
(for
) и тег select
(id
и name
).
В вашем примере идентификатор / имя должны быть upsizing_products
, а текст метки Upsizing Products
:
<label for="upsizing_products"><?php _e( 'Upsizing Product', 'woocommerce' ); ?></label>
<select class="wc-product-search" multiple="multiple" style="width: 50%;" id="upsizing_products" name="upsizing_products[]" data-placeholder="<?php esc_attr_e( 'Search for a product…', 'woocommerce' ); ?>" data-action="woocommerce_json_search_products_and_variations" data-exclude="<?php echo intval( $post->ID ); ?>">
Примечание. Не забудьте поставить []
и конец именного тега, иначе ваши данные не будут сохранены.
2.2. Показать уже выбранные товары
Следующее, что нужно сделать, это показать и выделить уже выбранные продукты в разделе WooCommerce и в раскрывающемся списке.
Для этого замените $product_ids
-переменную и всю строку на:
$product_ids = get_post_meta( $post->ID, '_upsizing_products_ids', true );
Вместо этого идентификатор продукта извлекается из настраиваемого поля в базе данных вместо одной из существующих опций (например, cross_sell_ids).
Примечание. _upsizing_products_ids
- это имя мета-ключа в базе данных. Мета-значение, связанное с этим ключом, содержит все данные вашего поля. Это используется для хранения и извлечения настраиваемого поля.
2.3. Отобразите поле в разделе WooCommerce
Наконец, функция должна быть правильно подключена, чтобы ее можно было отобразить в разделе Связанные продукты:
add_action( 'woocommerce_product_options_related', 'woocom_linked_products_data_custom_field' );
3. Сохраните и сохраните данные.
Теперь ваше настраиваемое поле отображается в правом разделе. Следующее, что нужно сделать, это сохранить и сохранить данные в базе данных.
Внутри новой функции используйте $_POST
для извлечения данных из поля и update_post_meta
для сохранения данных в базе данных, содержащей идентификатор записи, уникальный идентификатор поля / имя (мета-ключ) и сами данные (мета-значение).
function woocom_linked_products_data_custom_field_save( $post_id ){
$product_field_type = $_POST['upsizing_products'];
update_post_meta( $post_id, '_upsizing_products_ids', $product_field_type );
}
add_action( 'woocommerce_process_product_meta', 'woocom_linked_products_data_custom_field_save' );
Вот полный код. Поместите его в свои темы functions.php
или в файл плагина:
// Display the custom fields in the "Linked Products" section
add_action( 'woocommerce_product_options_related', 'woocom_linked_products_data_custom_field' );
// Save to custom fields
add_action( 'woocommerce_process_product_meta', 'woocom_linked_products_data_custom_field_save' );
// Function to generate the custom fields
function woocom_linked_products_data_custom_field() {
global $woocommerce, $post;
?>
<p class="form-field">
<label for="upsizing_products"><?php _e( 'Upsizing Product', 'woocommerce' ); ?></label>
<select class="wc-product-search" multiple="multiple" style="width: 50%;" id="upsizing_products" name="upsizing_products[]" data-placeholder="<?php esc_attr_e( 'Search for a product…', 'woocommerce' ); ?>" data-action="woocommerce_json_search_products_and_variations" data-exclude="<?php echo intval( $post->ID ); ?>">
<?php
$product_ids = get_post_meta( $post->ID, '_upsizing_products_ids', true );
foreach ( $product_ids as $product_id ) {
$product = wc_get_product( $product_id );
if ( is_object( $product ) ) {
echo '<option value="' . esc_attr( $product_id ) . '"' . selected( true, true, false ) . '>' . wp_kses_post( $product->get_formatted_name() ) . '</option>';
}
}
?>
</select> <?php echo wc_help_tip( __( 'Select Products Here.', 'woocommerce' ) ); ?>
</p>
<?php
}
// Function the save the custom fields
function woocom_linked_products_data_custom_field_save( $post_id ){
$product_field_type = $_POST['upsizing_products'];
update_post_meta( $post_id, '_upsizing_products_ids', $product_field_type );
}
Для отображения сохраненных данных используйте _upsizing_products_ids
:
echo get_post_meta( $post->ID, 'my-field-slug', true );
Ознакомьтесь с этим руководством Освоение настраиваемых полей продуктов WooCommerce для получения дополнительной информации о настраиваемых Поля для WooCommerce.
10.08.2017