Задать вопрос
@Rylezzz

WooCommerce — как в/shop заменить ссылку на товар на ссылку из атрибутов?

Здравствуйте.

Задача - реализовать подобный каталог в упрощённом виде на WP (нужно только Лого, Наименование, Ссылка на сайт фабрики). Чтобы нормально сделать фильтр по алфавиту, придумал только сделать всё это посредством WooCommerce, смотря что проще реализовать:
1. в мини-карточке: Лого фабрики, Наименование фабрики и при клике происходит переход на сайт фабрики
или
2. в мини-карточке: Лого фабрики, Наименование фабрики, Активная ссылка на сайт фабрики

я так понимаю, ссылка на сайт фабрики в таком случае прописывается в атрибутах, чтобы можно было просто из Excel импортировать? Как её в таком случае правильно вставить в шаблон?

Т. к. сайт - не ИМ и карточка товара не нужна вовсе, то нагуглил такой вариант убрать ссылку на саму карточку:
remove_action( 'woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open', 10 );
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_product_link_close', 5 );


Если есть какой-то более логичный способ реализовать данную задачу, буду только рад узнать. Не хочется статично верстать лишние 25 страниц для имитации фильтра по алфавиту.

Буду благодарен за помощь.
  • Вопрос задан
  • 1608 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@Rylezzz Автор вопроса
Да, детка!
Я понимаю, что для многих пользователей это детский лепет, но для меня это победа))

Как я реализовал задуманное.

ВАЖНО! сохраняйте оригиналы всех изменяемых файлов. А ещё лучше - сделайте на всякий случай бэкап на хостинге

Вывод данных в мини-карточке в магазине /shop производится посредством хуков (hook) в файле content-product.php темы.
Оригинальный content-product.php
<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

global $product, $woocommerce_loop;

// Ensure visibility
if ( empty( $product ) || ! $product->is_visible() ) {
	return;
}

// Store column count for displaying the grid
if ( empty( $woocommerce_loop['columns'] ) ) {
	$woocommerce_loop['columns'] = apply_filters( 'loop_shop_columns', 3 );
}

// Extra post classes
$classes = array();
if ($woocommerce_loop['columns'] == 2) {
	$classes[] = 'col-md-6';
}elseif($woocommerce_loop['columns'] == 4){
	$classes[] = 'col-md-3';
}elseif($woocommerce_loop['columns'] == 6){
	$classes[] = 'col-md-2';
}else{
	$classes[] = 'col-md-4';
}
?>
<div <?php post_class( $classes ); ?>>
<div class="product-item">
	<?php
	/**
	 * woocommerce_before_shop_loop_item hook.
	 *
	 * @hooked woocommerce_template_loop_product_link_open - 10
	 */
	do_action( 'woocommerce_before_shop_loop_item' );
	?>
	<b><a href="<?php the_permalink(); ?>" class="products-warp"></b>
	<?php
	/**
	 * woocommerce_before_shop_loop_item_title hook.
	 *
	 * @hooked woocommerce_template_loop_product_thumbnail - 10
	 * @hooked woocommerce_show_product_loop_sale_flash - 10
	 */
	do_action( 'woocommerce_before_shop_loop_item_title' );
	?>
	<b></a></b>
	<div class="product-info">
	<b><a href="<?php the_permalink(); ?>"></b>
		<?php
			/**
			 * woocommerce_shop_loop_item_title hook.
			 *
			 * @hooked woocommerce_template_loop_product_title - 10
			 */
			do_action( 'woocommerce_shop_loop_item_title' );
		?>
	<b></a></b>
	<?php
	/**
	 * woocommerce_after_shop_loop_item_title hook.
	 *
	 * @hooked woocommerce_template_loop_rating - 5
	 * @hooked woocommerce_template_loop_price - 10
	 */
	<b>do_action( 'woocommerce_after_shop_loop_item_title' );</b>

	/**
	 * woocommerce_after_shop_loop_item hook.
	 *
	 * @hooked woocommerce_template_loop_product_link_close - 5
	 * @hooked woocommerce_template_loop_add_to_cart - 10
	 */
	<b>do_action( 'woocommerce_after_shop_loop_item' );</b>
	?>
	</div>
</div>
</div>

Первым делом я убрал ссылки с <?php the_permalink(); ?>, т. к. карточка товара не нужна совсем. Да, изящнее было бы разобраться и заменить на функцию, выводящую нужные мне ссылки, но времени на это, увы, нет.

Далее - убрал do_action( 'woocommerce_after_shop_loop_item_title' ); и do_action( 'woocommerce_after_shop_loop_item' ); , т. к. рейтинг, цена и кнопка "В корзину" мне опять же не нужны.

Ссылки на сайты фабрик я разместил в short description соответственно в каждом товаре в виде
<a href="http://www.ararredamenti.it/" rel="noopener" target="_blank">www.ararredamenti.it</a>
(Excel в помощь). Соответственно теперь нужно добавить хук, который выводил бы нам short description.

Для этого в файле /wp-content/plugins/woocommerce/includes/wc-template-hooks.php добавляем
/**
 * Ссылки на фабрики в /shop.
 */
add_action( 'woocommerce_brands_link', 'woocommerce_template_single_excerpt', 10 );

Вот эту штуку - 'woocommerce_template_single_excerpt', я подглядел в шаблоне карточки товара content-single-product.php темы - заметил, что это часть хука, выводящая информацию по товару.

Далее добавляем этот хук в content-product.php темы после хука заголовка товара, в итоге получилось вот так:
Изменённый content-product.php
<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

global $product, $woocommerce_loop;

// Ensure visibility
if ( empty( $product ) || ! $product->is_visible() ) {
	return;
}

// Store column count for displaying the grid
if ( empty( $woocommerce_loop['columns'] ) ) {
	$woocommerce_loop['columns'] = apply_filters( 'loop_shop_columns', 3 );
}

// Extra post classes
$classes = array();
if ($woocommerce_loop['columns'] == 2) {
	$classes[] = 'col-md-6';
}elseif($woocommerce_loop['columns'] == 4){
	$classes[] = 'col-md-3';
}elseif($woocommerce_loop['columns'] == 6){
	$classes[] = 'col-md-2';
}else{
	$classes[] = 'col-md-4';
}
?>
<div <?php post_class( $classes ); ?>>
<div class="product-item">
	<?php
	/**
	 * woocommerce_before_shop_loop_item hook.
	 *
	 * @hooked woocommerce_template_loop_product_link_open - 10
	 */
	do_action( 'woocommerce_before_shop_loop_item' );
	?>

	<?php
	/**
	 * woocommerce_before_shop_loop_item_title hook.
	 *
	 * @hooked woocommerce_template_loop_product_thumbnail - 10
	 * @hooked woocommerce_show_product_loop_sale_flash - 10
	 */
	do_action( 'woocommerce_before_shop_loop_item_title' );
	?>

	<div class="product-info">
		<?php
			/**
			 * woocommerce_shop_loop_item_title hook.
			 *
			 * @hooked woocommerce_template_loop_product_title - 10
			 */
			do_action( 'woocommerce_shop_loop_item_title' );
			do_action( 'woocommerce_brands_link' );
		?>
	<?php

	?>
	</div>
</div>
</div>

В итоге - то, что нужно
Скрин результата
5c373da3449f0917367287.png

Знаю, что реализация далека от the best. С php знаком только на уровне вот такого редкого ковыряния тем и плагинов. В силу этого ни в коем случае не претендую на экспертное мнение. Надеюсь, будет полезно тем, кто так же, как и я, искал способ решения такой задачи, т. к. теперь могу сразу добавить 300 фабрик на сайт импортом из Excel
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@coverme
Можно реализовать плагином на подобие -
https://uk.wordpress.org/plugins/yith-woocommerce-...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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