@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 страниц для имитации фильтра по алфавиту.

Буду благодарен за помощь.
  • Вопрос задан
  • 36 просмотров
Решения вопроса 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
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@weart
Мне кажется, проще всего такое сверстать на категориях/подкатегориях продукта.

Если уже есть какие-то заполненные категории, просто зарегить новые кастомные и автоматом собрать такую страницу, только еще фильтр написать для сортировки по первым буквам, если нужен.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы