Ответы пользователя по тегу WordPress
  • WooCommerce - как в/shop заменить ссылку на товар на ссылку из атрибутов?

    @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 комментарий