#php #wordpress #function #if-statement #woocommerce
#php #wordpress #функция #if-оператор #woocommerce
Вопрос:
Мне нужно руководство по коду. В настоящее время он работает корректно для меня. Что делает код, так это ограничивает комбинацию товаров из разных категорий, то есть только вы можете добавлять в корзину товары из одной категории одновременно.
Но теперь мне нужно, чтобы этот код выполнялся только тогда, когда подключена определенная роль, в данном случае роль «Франчайзинга». Я изменил код и поставил условие, чтобы оно применялось только к роли «Франшиза», но оно не работает должным образом, по сути, ограничивает меня комбинацией категорий в «Франшизах», но в других ролях не позволяет мне добавлять товар в корзину и не является тем, что я хотите, должно быть разрешено нормально добавлять другие существующие роли и комбинировать продукты из разных категорий, предполагая, что вы устанавливаете условия для этих ограничений только в «Франшизе».
Я был бы признателен вам за помощь, пожалуйста
Вот моя попытка кода:
$user = wp_get_current_user();
if ( in_array( 'franquicia', (array) $user->roles ) ) {
function avoid_add_to_cart_from_different_main_categories( $passed, $product_id, $quantity ) {
$cart = WC()->cart;
$taxonomy = 'product_cat';
$ancestors = [];
if( $cart->is_empty() )
return $passed;
$terms = (array) wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'ids') );
if( count($terms) > 0 ) {
// Loop through product category terms set for the current product
foreach( $terms as $term) {
foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
$ancestors[(int) $term_id] = (int) $term_id;
}
}
// Loop through cart items
foreach ( $cart->get_cart() as $item ) {
$terms = (array) wp_get_post_terms( $item['product_id'], $taxonomy, array('fields' => 'ids') );
if( count($terms) > 0 ) {
// Loop through product category terms set for the current cart item
foreach( $terms as $term) {
foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
$ancestors[(int) $term_id] = (int) $term_id;
}
}
}
}
// When there is more than 1 parent product category
if( count($ancestors) > 1 ) {
wc_add_notice( __('Disculpa, NO puedes agregar a la misma orden/pedido productos que pertenezcan a distintas preventas o proveedores. Por favor, escoge solo productos que pertenezcan una misma preventa o proveedor.'), 'error' );
$passed = false;
}
}
return $passed;
}
}
add_filter( 'woocommerce_add_to_cart_validation', 'avoid_add_to_cart_from_different_main_categories', 10, 3 );
Я был бы признателен вам за помощь.
Ответ №1:
Вам необходимо использовать условие оператора user role IF внутри вашей функции следующим образом:
function avoid_add_to_cart_from_different_main_categories( $passed, $product_id, $quantity ) {
if( WC()->cart->is_empty() )
return $passed;
$user = wp_get_current_user();
if ( in_array( 'franquicia', $user->roles ) ) {
$taxonomy = 'product_cat';
$ancestors = [];
$terms = (array) wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'ids') );
if( count($terms) > 0 ) {
// Loop through product category terms set for the current product
foreach( $terms as $term) {
foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
$ancestors[(int) $term_id] = (int) $term_id;
}
}
// Loop through cart items
foreach ( WC()->cart->get_cart() as $item ) {
$terms = (array) wp_get_post_terms( $item['product_id'], $taxonomy, array('fields' => 'ids') );
if( count($terms) > 0 ) {
// Loop through product category terms set for the current cart item
foreach( $terms as $term) {
foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
$ancestors[(int) $term_id] = (int) $term_id;
}
}
}
}
// When there is more than 1 parent product category
if( count($ancestors) > 1 ) {
wc_add_notice( __('Disculpa, NO puedes agregar a la misma orden/pedido productos que pertenezcan a distintas preventas o proveedores. Por favor, escoge solo productos que pertenezcan una misma preventa o proveedor.'), 'error' );
$passed = false;
}
}
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'avoid_add_to_cart_from_different_main_categories', 10, 3 );
Код вводится functions.php файл активной дочерней темы (или активной темы). Это должно работать лучше.
Комментарии:
1. Я вставил код в functions.php , но это сгенерировало ошибку: functions.php : gyazo.com/141a92391478104c245598462a13332b ошибка: gyazo.com/25ed17217d641ad10358795d892513d8
2. Большое вам спасибо, все работает отлично, я вам очень благодарен. Если это не слишком затруднит, не могли бы вы сказать мне, что мне делать, если вместо одной роли я хочу разместить несколько ролей? например, автор и клиент. ПД: Извините за мой плохой английский.