Andrey_Tech
@Andrey_Tech

Вывод атрибутов в Woocommerce для незарегестрированынх пользоватлей?

Добрый день!
Столкнулся с такой проблемой
Мне надо вывести атрибуты на woocommerce, так что бы их видели не зарегистрированные пользователи.
Я вставляю в function.php следующий код:

add_action('init', 'my_theme_hide_price_not_authorized');
function my_theme_hide_price_not_authorized() {
  if ( !is_user_logged_in() ) {
    add_filter( 'woocommerce_attribute', 'my_theme_hide_attribute');
  }
}

function my_theme_hide_attribute() {
$subheadingvalues = get_the_terms( $product->id, 'pa_color'); 
foreach ( $subheadingvalues as $subheadingvalue ) { 
echo $subheadingvalue->name; }
}

Но он работает не корректно, функция выводит один атрибут и проставляет во всех ячейках других атрибутов что есть
Вот как это происходит ->
5a22e2a376e44699ac3a797dac8ca11f.png

Что делать, не понимаю, поскольку в php еще новичок
  • Вопрос задан
  • 1298 просмотров
Решения вопроса 1
Andrey_Tech
@Andrey_Tech Автор вопроса
Да, это функция
add_action('init', 'my_theme_hide_price_not_authorized');
function my_theme_hide_price_not_authorized() {
  if ( !is_user_logged_in() ) {
    add_filter( 'woocommerce_attribute', 'my_theme_hide_attribute');
  }
}


работает корректно, она скрывает атрибуты, только все сразу
То есть не зарегистрированные пользователи должны видеть только некоторые атрибуты, все остальные для них должны быть скрыты

вот код product_attributes.ph, по выводу атрибутов:
<table class="shop_attributes">

	<?php if ( $product->enable_dimensions_display() ) : ?>

		<?php if ( $product->has_weight() ) : $has_row = true; ?>
			<tr class="<?php if ( ( $alt = $alt * -1 ) === 1 ) echo 'alt'; ?>">
				<th><?php _e( 'Weight', 'woocommerce' ) ?></th>
				<td class="product_weight"><?php echo wc_format_localized_decimal( $product->get_weight() ) . ' ' . esc_attr( get_option( 'woocommerce_weight_unit' ) ); ?></td>
			</tr>
		<?php endif; ?>

		<?php if ( $product->has_dimensions() ) : $has_row = true; ?>
			<tr class="<?php if ( ( $alt = $alt * -1 ) === 1 ) echo 'alt'; ?>">
				<th><?php _e( 'Dimensions', 'woocommerce' ) ?></th>
				<td class="product_dimensions"><?php echo $product->get_dimensions(); ?></td>
			</tr>
		<?php endif; ?>

	<?php endif; ?>

	<?php foreach ( $attributes as $attribute ) :
		if ( empty( $attribute['is_visible'] ) || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
			continue;
		} else {
			$has_row = true;
		}
		?>
		<tr class="<?php if ( ( $alt = $alt * -1 ) == 1 ) echo 'alt'; ?>">
			<th><?php echo wc_attribute_label( $attribute['name'] ); ?></th>
			<td><?php
				if ( $attribute['is_taxonomy'] ) {

					$values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) );
					echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );

				} else {

					// Convert pipes to commas and display values
					$values = array_map( 'trim', explode( WC_DELIMITER, $attribute['value'] ) );
					echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );

				}
			?></td>
		</tr>
	<?php endforeach; ?>

</table>


я не знаю как сделать переопределение,я раньше такого просто не делал
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Palych_tw
@Palych_tw
Типа веб-разработчик
Вы же в этой строке
get_the_terms( $product->id, 'pa_color');
запрашиваете атрибуты только цвета, вот и получаете Blue везде. Вставьте код в вопрос по-человечески, чтоб все можно было прочитать, вместе с разметкой

UPD Лучше вообще вот так.. просто удалите табу с характеристиками для залогиненых пользователей
Этот код в functions.php
add_filter( 'woocommerce_product_tabs', 'woo_remove_product_tabs', 98 );

function woo_remove_product_tabs( $tabs ) {

    if ( is_user_logged_in() ) {
           unset( $tabs['additional_information'] );  	
    }

    return $tabs;

}


UPD 2 Копируете product_attributes.php себе в тему
И в цикл вывода атрибутов вставляете свое условие:
<?php $names = array ('один атрибут', 'второй атрибут') //имена атрибутов, которые не будем показывать

foreach ( $attributes as $attribute ) :
   
   if ( !is_user_logged_in() && in_array($attribute['name'], $names ) { 
         continue;  //пропускаем атрибут
    }
    if ( empty( $attribute['is_visible'] ) || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
      continue;
    } else {
      $has_row = true;
    }
    ?>
    <tr class="<?php if ( ( $alt = $alt * -1 ) == 1 ) echo 'alt'; ?>">
      <th><?php echo wc_attribute_label( $attribute['name'] ); ?></th>
//далее остальной файл
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы