#wordpress #taxonomy-terms #add-action
Вопрос:
Мы строим магазин одежды. Продукты, которые будут загружены, могут иметь размеры этикеток из разных стран, и поэтому у нас есть две таксономии размеров: product_size и product_size_uk.
Я пытаюсь установить размер Великобритании на основе международного размера в момент сохранения/обновления продукта и запускаю переключатель, чтобы установить переменную в идентификатор таксономии размера Великобритании и использовать wp_set_object_terms. Но это не работает:
add_action( 'save_post', 'save_uk_size' );
function save_uk_size( $post_id ) {
if ( $post->post_type == 'product' ) {
$post = get_post($post_id);
$terms = wp_get_post_terms( $post->ID, 'product_size', array( 'fields' => 'all' ) );
if ( $terms ) {
$prod_size_int = $terms[0]->slug;
}
switch ($prod_size_int) {
...
case "FR-36":
$prod_size_uk = 805;
break;
case "FR-38":
$prod_size_uk = 806;
break;
...
}
wp_set_object_terms($post_id, $prod_size_uk, 'product_size_uk');
}
}
Кто-нибудь может направить меня в правильном направлении? Спасибо!
Ответ №1:
- Сначала вам необходимо установить плагин Advanced Custom Fields
- Затем для таксономии productsize мы создаем поле таксономии (productsize_uk).
Теперь на страницах таксономии productsize в панели администратора есть поле, в котором мы можем выбрать, какой productsize_uk соответствует данной таксономии.
3.Затем мы должны выбрать product_size_uk, подходящий для всех размеров.
А затем этот код
add_action( 'save_post_product', 'product_save_new_term' );
function product_save_new_term($post_id) {
remove_action( 'save_post_product', 'product_save_new_term' );
$terms = wp_get_object_terms( $post_id, 'product_size' );
$term_id = $terms[0]->term_id;
if($term_id != "") {
$key_for_field = 'product_size_' . $term_id;
$product_size_uk_value = get_field( 'product_size_uk', $key_for_field );
wp_set_object_terms($post_id, $product_size_uk_value, 'product_size_uk');
clean_post_cache( $post_id );
} else {
wp_delete_object_term_relationships( $post_id, 'product_size_uk' );
}
add_action( 'save_post_product', 'product_save_new_term' );
}
Или, если вы не хотите иметь элементы управления для сопоставления размеров в панели администратора, и вам проще написать все в коде.
add_action( 'save_post_product', 'product_save_new_term' );
function product_save_new_term($post_id) {
$data_array = array(
"product_size_term_id" => "product_size_uk_term_id",
"product_size_term_id2" => "product_size_uk_term_id2",
"product_size_term_id3" => "product_size_uk_term_id3",
);
remove_action( 'save_post_product', 'product_save_new_term' );
$terms = wp_get_object_terms( $post_id, 'product_size' );
$term_id = $terms[0]->term_id;
if($term_id != "") {
$product_size_uk_value = $data_array[$term_id];
if($product_size_uk_value !="") {
wp_set_object_terms($post_id, $product_size_uk_value, 'product_size_uk');
}
clean_post_cache( $post_id );
} else {
wp_delete_object_term_relationships( $post_id, 'product_size_uk' );
}
add_action( 'save_post_product', 'product_save_new_term' );
}
Комментарии:
1. Большое спасибо! Я попробую сделать это сегодня. Очень любезно с вашей стороны.
2. Я попробовал это (второй набор кода), и это не работает для меня. Может ли он работать со слизняками вместо идентификаторов? Кроме того, должно
$terms = wp_get_object_terms( $post_id, 'product_size' );
быть для «продукта» вместо «produc_t_size»?3. wp_get_object_terms нужны 2 переменные, $post_id и имя таксономии. нам здесь не нужно имя post_type. Мы можем использовать slug только в том случае, если ваша таксономия не является иерархической. Я протестировал этот код на своей демо-версии, его работу.