Ответы пользователя по тегу WooСommerce
  • Как вывести все товары определенного пользователя Woocommerce на странице сайта или в записи блога?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Скорее всего вы хотите вывести товары не какого-то конкретного пользователя, а текущего. Для этого вам может быть подойдет больше хук pre_get_posts, на нем по нужным условиям можно отфильтровать основной запрос:

    add_action( 'pre_get_posts', 'set_products_current_user', 1 );
    function set_products_current_user( $query ) {
    	// Выходим, если это админ-панель или не основной запрос
    	if( is_admin() || ! $query->is_main_query() )
    		return;
    
    	// Устанавливаем текущего юзера, если это запрос товаров
    	if ( $query->get( 'post_type' ) == 'product' ) {
    		$query->set( 'author', get_current_user_id() );
    	}
    
    }
    Ответ написан
  • Как сделать разделение на категории и подкатегории WooCommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Такой список категорий сделать достаточно просто. Плагинами я практически не пользуюсь, но могу показать код, на основе которого вы сможете это реализовать

    1. Для начала нам нужно сделать запрос терминов и пересобрать полученный объект в массив таким образом, чтобы родительская рубрика лежала в одном подмассиве с дочерними, т.е. чтобы у них был общий ключ

    $taxonomy = 'category';
    $args = [
    		'taxonomy' => $taxonomy, // название таксономии с WP 4.5
    		'hide_empty' => false,
    ];
    
    if ( $terms = get_terms( $args ) ) {
    	$output = array();
    	foreach ( $terms as $key => $term ) {
    		if ( $term->parent == 0 ) {
    			$output[$term->term_id]['parent']['title'] = $term->name;
    			$output[$term->term_id]['parent']['link'] = get_term_link( $term->term_id, $taxonomy );
    		} else {
    			$output[$term->parent]['children'][$key]['title'] = $term->name;
    			$output[$term->parent]['children'][$key]['link'] = get_term_link( $term->term_id, $taxonomy );
    		}
    	}
    }


    2. На выходе, в переменную $output мы получаем массивы такого вида

    6108f82f21835125924035.png

    3. Теперь нам остается вывести все значения в нужном нам виде

    if ( isset( $output ) && is_array( $output ) && !empty( $output ) ) {
    
    	foreach ( $output as $key => $items ) {
    		echo '<h2 class="title"><a href="' . $items['parent']['link'] . '" class="title-link">' . $items['parent']['title'] . '</a></h2>';
    		if ( isset( $items['children'] ) ) {
    			echo '<ul class="list">';
    			foreach ( $items['children'] as $key => $item ) {
    				echo '<li class="list-item"><a href="' . $item['link'] . '" class="list-link">' . $item['title'] . '</a></li>';
    			}
    			echo '</ul>';
    		}
    	} // end foreach
    
    } // end if


    PS. Нашел в таблице wp_options опцию category_children, в которой уже записаны связи родитель → ребенок, так что можно использовать ее и упростить код выше
    Ответ написан
    Комментировать
  • Можно ли по-другому записать код в шорткоде?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Сделал опрятнее и дам несколько советов

    1. Для вывода тегов в ядре есть функции the_tags(), get_the_tag_list() и get_the_term_list()
    2. Вы можете определить список атрибутов $atts, чтобы сделать шорткод более универсальным
    3. Нужно проверять, что переменная $post определена, get_queried_object() не сработает для главной, архивов и некоторых других шаблонов
    4. Шорткод ВСЕГДА должен возвращать return, а не делать вывод echo
    5. Если функция возвращает данные, то хорошо поставить apply_filters(), это сэкономит вам кучу времени и нервов, если понадобится поменять возвращаемые данные с помощью фильтра add_filter()
    6. В тег <ul> можно вкладывать только элементы <li>


    // Использование [tag-list field="метки_и_ссылки" class="tag-list"]
    add_shortcode( 'tag-list', 'get_custom_tag_list' );
    function get_custom_tag_list( $atts ) {
    
    	// белый список параметров и значения по умолчанию для шорткода
    	$atts = shortcode_atts( array(
    		'class' => 'list',
    		'field' => '',
    		'post_id' => 0
    	), $atts );
    
    	$output = '';
    	$post = get_post( $atts['post_id'] );
    
    	if ( isset( $post->ID ) && !empty($atts['field']) ) {
    		$tags = get_field_object( $atts['field'], $post->ID );
    		if ( $tags ) {
    			$output .= '<ul class="' . $atts['class'] . '">';
    			foreach ( $tags['value'] as $key => $value ) {
    				$output .= '<li class="' . $atts['class'] . '__item" >';
    					$output .= '<a class="' . $atts['class'] . '__link" href="' . $value->description . '" rel="tag">' . $value->name . '</a>';
    				$output .= '</li>';
    			}
    			$output .= '</ul>';
    		}
    	}
    
    	return apply_filters( 'get_custom_tag_list', $output );
    	
    }
    Ответ написан
    Комментировать
  • В иерархии темы wordpress файл taxonomy.php ниже index.php, как такое может получится?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Для категорий taxonomy.php вообще не используется

    60db24205c359517953470.png
    Ответ написан
    Комментировать
  • Membership на Wordpress с ограниченной возможностью покупок, возможно?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Звучит не очень сложно, но писать руками, скорее всего, все равно придется

    Вам нужен хук, который идет после оплаты выбранного тарифа в той платежной системе, которой вы пользуетесь. На этом хуке проверяете, что оплата прошла успешно и с помощью update_user_meta() добавляете тип тарифа, кол-во кредитов и дату, до которой он оплачен, если плагин этого не делает

    Ну а дальше совсем просто - при любом целевом действии, отнимаете кредиты и при достижении 0 закрываете функцию букинга и выводите уведомление: "Кредиты кончились, платите снова"
    Ответ написан
    Комментировать
  • Как работает terms() в woo ??

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Просто удалите аргументы, значения которых вы не понимаете и все заработает

    $terms = get_terms(array(
    	'taxonomy' => 'product_cat',
    	'hide_empty' => false,
    ));


    608b0b953facb334465116.png
    Ответ написан
  • Как удалить описание категории WooCommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Скорее всего вам нужны эти хуки

    remove_action( 'woocommerce_archive_description', 'woocommerce_taxonomy_archive_description', 10 );
    remove_action( 'woocommerce_archive_description', 'woocommerce_product_archive_description', 10 );
    Ответ написан
    Комментировать
  • Как создать около 50 поддоменов на Wordpress (Multisite)?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Чем вас мультисайт не устроил? Сайты в сети можно создать программно. Вот пример, создавал так поддомены на все 85 регионов

    $cities = array(
    	'mos' => 'Москва',
    	'spb' => 'Санкт-Петербург',
    	'nsk' => 'Новосибирск',
    	'ekb' => 'Екатеринбург',
    );
    
    $pathinfo = pathinfo(home_url());
    $network_id = get_current_network_id();
    $user_id = get_current_user_id();
    
    foreach ( $cities as $key => $city ) {
    	
    	$site_data = array(
    		'domain' => $key .'.' . $pathinfo['basename'],
    		'path' => '/',
    		'network_id' => $network_id,
    		'user_id' => $user_id,
    		'title' => 'Заголовок сайта ' . $city,
    		'options' => [
    			'blogdescription' => 'Описание сайта ' . $city,
    			'permalink_structure' => '/%category%/%postname%/',
    			'template' => 'twentytwenty',
    			'stylesheet' => 'twentytwenty',
    			'posts_per_page' => '12',
    			'active_plugins' => [
    				'cyr2lat/cyr-to-lat.php',
    				'query-monitor/query-monitor.php',
    				'wordpress-seo/wp-seo.php',
    				'wp-fastest-cache/wpFastestCache.php'
    			]
    		]
    	);
    
    	// вставляем сайт в базу данных
    	$site_id = wp_insert_site( $site_data );
    
    	// пишем ошибку/успех
    	if( is_wp_error( $site_id ) ) {
    		var_dump( 'Ошибка инсерта мультисайта ' . $key . ': ' . $site_id->get_error_message() );
    	} else {
    		var_dump( 'Мультисайт ' . $key . ' опубликован удачно!' );
    	}
    
    } // end foreach $cities


    Можно исхитриться и дублировать контент с главного сайта на поддомены тоже программно
    Ответ написан
    1 комментарий
  • Перевод содержимого сайта на английский и установка его по умолчанию?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Это делается через api переводчика, они платные. Google translate price, тарифы Яндекс.Переводчик
    Ответ написан
    Комментировать
  • Что не так с пагинацией в Woo?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Что вы хотите сделать? В вукомерс уже есть все шаблоны, циклы, пагинация, шорткоды. Ничего изобретать не нужно

    Про ajax подгрузку постов/товаров в сети тьма статей, видео и плагинов

    И the_post_thumbnail() не принимает то, что вы в нее передаете
    Ответ написан
    Комментировать
  • Проблема с выходом из страницы пользователя?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    <a href="<?php echo wp_logout_url( home_url() ); ?>" title="Выход">Выход</a>
    Ответ написан
    Комментировать
  • Как сделать калькулятор доставки woocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Нормальных плагинов я не видел, но если они есть, меня поправят. Вот решение с помощью api яндекс карт, проверка адреса на попадание в зону доставки https://yandex.ru/dev/maps/jsbox/2.1/delivery_zones
    Ответ написан
    Комментировать
  • Как закрыть карточки товаров от индексации?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Еще вариант - проверять post_type и выводить noindex в wp_head

    add_action( 'wp_head', 'product_noindex', 1 );
    if ( ! function_exists( 'product_noindex' ) ) {
    	function product_noindex() {
    
    		if( get_post_type() === 'product' ) {
    			echo '<meta name="robots" content="noindex, nofollow, noarchive"/>';
    		}
    		
    	}
    }
    Ответ написан
  • Как вывести описание категории woocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Используйте the_archive_description()
    Ответ написан
    Комментировать
  • Можно обойти ограничение на импорт товаров Woocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Что значит не разрешает? Все что попадает во фронт можно скачать за очень редким исключением. Я бы грешил на парсинг или его настройку
    Ответ написан
    Комментировать
  • Как кастомизировать карточку товара WooCommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вот так получаем и выводим 5 последних товаров из категории "Рождество":

    // задаем нужные нам критерии выборки данных из БД
    $args = array(
    	'posts_per_page' => 5,
    	'post_type' => 'product',
    	'tax_query' => array(
    		array(
    			'taxonomy' => 'product_cat',
    			'field' => 'slug',
    			'terms' => 'сhristmas'
    		)
    	)
    );
    
    $query = new WP_Query( $args );
    
    // Цикл
    if ( $query->have_posts() ) {
    	echo '<ul class="slider">';
    	while ( $query->have_posts() ) {
    		$query->the_post();
    		echo '<li class="slider__item">' . get_the_title() . '</li>';
    	}
    	echo '</ul>';
    } else {
    	// Постов не найдено
    }
    // Возвращаем оригинальные данные поста. Сбрасываем $post.
    wp_reset_postdata();


    Теперь берете понравившийся слайдер, я советую slick slider или owlcarousel. Скрипты подключаете через wp_enqueue_script(), стили - wp_enqueue_style()

    В конце не забываем про инициализацию слайдера:

    $(document).ready(function(){
    	$('.slider').slick({
    		setting-name: setting-value
    	});
    });


    Это или в отдельном js-файле, или с помощью wp_add_inline_script() на зависимость от основного slick-скрипта
    Ответ написан
  • Как прописать шаблон мета-тегов для страниц товаров и главной странице в Yoast SEO?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы можете создать свои переменные для йоаста. Вот примеры:

    function get_seo_instead_title() {
    	if ( is_single() ) {
    		if ( get_post_type() === 'route' ) {
    			$roads_subtype = get_post_meta(get_the_ID(), 'subtype', true );
    			if ( $roads_subtype == 'bus' ) {
    				return 'Расписание автобусов ' . get_the_title();
    			} else {
    				return 'Расписание маршрутов ' . get_the_title();
    			}
    		}
    	}
    }
    
    function get_seo_before_title() {
    	if ( is_tax() ) {
    		if ( is_tax( 'routes' ) ) {
    			return 'Справочник маршрутов города ';
    		}
    	}
    }
    
    function get_seo_after_title() {
    	if ( is_single() ) {
    		if ( get_post_type() === 'platform' ) {
    			return ' — маршруты и расписание транспорта';
    		}
    	}
    }
    
    // %%BeforeTitle%% %%title%% %%AfterTitle%%
    // %%BeforeTitle%% %%term_title%% %%AfterTitle%%
    
    // define the action for register yoast_variable replacments
    function register_custom_yoast_variables() {
    	wpseo_register_var_replacement( '%%BeforeTitle%%', 'get_seo_before_title', 'advanced', 'Some before title text' );
    	wpseo_register_var_replacement( '%%AfterTitle%%', 'get_seo_after_title', 'advanced', 'Some after title text' );
    	wpseo_register_var_replacement( '%%InsteadTitle%%', 'get_seo_instead_title', 'advanced', 'Some instead title text' );
    }
    
    // Add action
    add_action('wpseo_register_extra_replacements', 'register_custom_yoast_variables');


    Как видите, переменная $post определена, поэтому работают все функции типа get_the_ID(), get_the_title(), get_post_meta() и т.д. Общие шаблоны находятся в соседних вкладках того скриншота, который вы показываете - Типы содержимого и Таксономии
    Ответ написан
    Комментировать
  • Как реализовать обновление цен по расписанию?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    1. Получаем все товары get_posts( [ 'post_type' => 'product' ] );
    2. В цикле получаем нужное поле с помощью get_post_meta()
    3. Что-то с ним делаем
    4. Пушим обратно update_post_meta()
    5. Вешаем все на крон и тестим
    Ответ написан
    1 комментарий
  • Произвольная сортировка в категории wocommerce?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Будут работать только те аргументы, которые принимает шорткод, смотрите параметр orderby и order
    Ответ написан
    Комментировать