С Новым годом! Форум программистов, компьютерный форум, киберфорум
WordPress
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
24 / 17 / 8
Регистрация: 29.12.2010
Сообщений: 161

Вывод категорий на странице Woocommerce

06.03.2019, 12:23. Показов 6898. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем гуру!

Сразу к задаче.



Нужно сделать вот так на отдельной странице. Тоесть вывести нужные категории, а под ними подкатегории.

Делать решил собственным шорткодом
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
add_shortcode('footag', 'footag_func');
function footag_func( $atts ){
    $atts = shortcode_atts( array(
        'catid' => '63'
    ), $atts, 'footag');
    $termID = $atts['catid']; // get_queried_object()->term_id; - динамическое получение ID текущей рубрики
$taxonomyName = "product_cat";
$termchildren = get_term_children( $termID, $taxonomyName );
$termname = get_term( $termID, $taxonomyName );
echo '<h3><a href="' . get_term_link( $termname->term_id, $termname->taxonomy ) . '">' . $termname->name . '</a></h3>';
echo '<ul>';
foreach ($termchildren as $child) {
    $term = get_term_by( 'id', $child, $taxonomyName );
    echo '<li><a href="' . get_term_link( $term->term_id, $term->taxonomy ) . '">' . $term->name . '</a></li>';
}
echo '</ul>';
};
Все казалось бы работает.
1. Но вот не могу ни как въехать как прикрутить параметр к шорткоду. Мне нужно чтобы можно было при вызове шорткода указать catid, то есть выбрать категорию.
2. При сохранение страницы на которой находится шорткод [footag] выдает ошибку сохранения. Не могу понять почему.
3. Как выдернуть миниатюру указанной категории, не пойму как совсем.
4. В указанной категории есть категории 3го уровня, как сделать так чтобы они не выводились.
Заранее спасибо!!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2019, 12:23
Ответы с готовыми решениями:

WooCommerce, вывод категорий в четыре столбца
Как вывести категории в четыре , допустим, столбца? Именно категории, товары я знаю как, мне надо везде чтобы категории отображались в...

Вывод категорий по текущему запросу (woocommerce)
Здравствуйте! делаю запрос для поиска товаров $search_str = $_GET; if(isset($_GET)) { $idcat = $_GET; } else { ...

Как запретить вывод всех категорий на главной странице?
В инете полно мануалов о том, как при помощи редактирования кода функции темы (functions.php) запретить вывод КОНКРЕТНОЙ категории на...

7
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
06.03.2019, 16:43
Ошибки внутри происходят или вывод echo

после
PHP
1
$termchildren = get_term_children( $termID, $taxonomyName );
вставил бы проверку типа
PHP
1
2
    if ($termchildren == null)
        return "";
и echo из функции этой делать нельзя
нужно все в переменную добавлять а потом ее возвращать!
Советую перечитать: add_shortcode

Добавлено через 4 минуты
Цитата Сообщение от toothcomp Посмотреть сообщение
миниатюру указанной категории
ID миниатюры скорее всего в метатегах категории (thumbnail_id)
Цитата Сообщение от toothcomp Посмотреть сообщение
есть категории 3го уровня
У терма смотреть ID родителя что бы совпадал с нужным (с первым уровнем)
1
24 / 17 / 8
Регистрация: 29.12.2010
Сообщений: 161
06.03.2019, 20:16  [ТС]
PHP
1
 get_term_link( $term->term_id, $term->taxonomy )
это в переменную? Потом уже делать echo?

Add shortcode - оттуда и брал части кода, ничего больше толкового не нашёл.

Параметр в шорткоде из-за ошибки не ставится получается?
Внутренний редактор не показывает ошибку, сохраняет файл, каким редактором проверить работу этого кода?

Добавлено через 2 часа 26 минут
Все башка взорвалась

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
add_shortcode('footag', 'footag_func');
function footag_func( $atts ){
    $atts = shortcode_atts( array(
        'catid' => '63'
    ), $atts, 'footag');
$termID = $atts['catid']; // get_queried_object()->term_id; - динамическое получение ID текущей рубрики
$taxonomyName = "product_cat";
$termchildren = get_term_children( $termID, $taxonomyName );
     if ( isset( $termchildren ) ) { //проверяю есть ли что то в массиве, при принте  там вот это Array ( [0] => 79 [1] => 81 [2] => 80 ), все верно! 
$termname = get_term( $termID, $taxonomyName ); 
$termnameout = '<h3><a href="' . get_term_link( $termname->term_id, $termname->taxonomy ) . '">' . $termname->name . '</a></h3>';
foreach ($termchildren as $child) { // перебираем все три значения в цикле
    if ( in_array( $child, $termchildren ) ) { // смотрим есть ли массив в значениях $child, $termchildren если есть идем дальше
                
    $term = get_term_by( 'id', $child, $taxonomyName ); // собираем в массив информацию о категории
                if ($term->parent = $termID) { // проверяем равняется ли категория родителя, выбранной категории, если да идем дальше
    $termlink = get_term_link( $term->term_id, $term->taxonomy ); // выдергиваем ссылку из массива term
    $termout[] = "<li><a href='" . $termlink . "'>" . $term->name . "</a></li>"; 
    }}
}
echo '<div class="cat-page">';
echo $termnameout;
echo '<ul>';
print_r ($child); // выводил посмотреть что в элементах прописывается сейчас там 80
echo "".implode($termout)."";
echo '</ul></div>';
    }
};
Родитель 63 -> чулдрены 79 и 81, а 79 родитель для 80
и все равно выводится в общем списке, хотя не проходит же проверку
PHP
1
if ($term->parent = $termID)
Думал над тем как еще до foreach ликвидировать категорию 80, придумалось только подставить чулдренов на проверку, но это также делается foreach и замкнутый круг ничего не понимаю.

По выводу изображения нашел только вывод миниатюры товара

PHP
1
2
3
4
5
6
7
8
9
global $product;
 
$attachment_ids = $product->get_gallery_image_ids();
 
if ( $attachment_ids && $product->get_image_id() ) {
    foreach ( $attachment_ids as $attachment_id ) {
        echo apply_filters( 'woocommerce_single_product_image_thumbnail_html', wc_get_gallery_image_html( $attachment_id ), $attachment_id ); // phpcs:disable WordPress.XSS.EscapeOutput.OutputNotEscaped
    }
}
Ничего по коду не понятно мне. Поиски продолжаются

Добавлено через 6 минут
2. Ошибка при сохранение записи с шорткодом так и не пропала. Но если удалить функцию и сохранить страницу, потом вставить функцию обратно, то при открытие страницы все прекрасно работает. Где ошибка не знаю. Заметил что при загрузки редактора страницы, выводится не на долго на пустой странице результат шорткода... думаю что изначально неправильно назначил шорткод, хотя вроде все делал по инструкции.

Добавлено через 19 минут
П.с. Почитал еще add shortcode и понял что я не сделал return " "; получается вывод значения шорткода можно только ретурном

Добавлено через 3 минуты
Крассссссным выделено это пипец
"Результат, который возвращает функция (обработчик шоткода) всегда должен возвращаться, а не выводиться на экран."
Думаю в этом все глюки
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
07.03.2019, 01:53
Лучший ответ Сообщение было отмечено toothcomp как решение

Решение

В связи с переходом на гутенберг, шорткоды по моему обязательно должны возвращать а не выводить результат.
Если в шорткоде будет ошибка, (нет 63 записи и нет проверок isset) wordpress ошибку выдаст в stdout и опять же JS гутенбергу поплохеет. Там сейчас все на Ajax, соответственно вывод должен быть в json а вы перед json echo пуляете.

Добавлено через 7 минут
Цитата Сообщение от toothcomp Посмотреть сообщение
По выводу изображения нашел только вывод миниатюры товара
PHP
1
2
3
4
5
6
7
8
$term = get_term( 69, 'product_cat' );                                                      
$thumbnail_id = absint( get_woocommerce_term_meta( $term->term_id, 'thumbnail_id', true ) );
if ( $thumbnail_id ) {                                                                      
    $image = wp_get_attachment_thumb_url( $thumbnail_id );                                  
} else {                                                                                    
    $image = wc_placeholder_img_src();                                                      
}                                                                                           
echo $image;
1
24 / 17 / 8
Регистрация: 29.12.2010
Сообщений: 161
07.03.2019, 06:08  [ТС]
Цитата Сообщение от HectorPrima Посмотреть сообщение
соответственно вывод должен быть в json а вы перед json echo пуляете
То есть в любом случае это идет к тому что в шорткоде нельзя выводит, только возвращать.
Сейчас переделаю на return посмотрю как будет работать

Добавлено через 14 минут
Ну вот другое дело, все заработало и сохранятся стала страница.

Но все равно не разобрался пока как 3й уровень категорий убрать, все равно вылезает. По идее для 3го уровня родителем и 1й уровень является, может быть выдернуть как раз родителя 2го уровня и сравнивать его parent ом 3го уровня. Буду разбираться.
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
07.03.2019, 06:54
Читать, читать и еще раз читать
PHP
1
2
3
4
5
6
7
$terms = get_terms(                        
    array(                                 
        'taxonomy' => array('product_cat'),
        'parent' => номер родителя,
        'hide_empty' => false
    )                                      
);
1
24 / 17 / 8
Регистрация: 29.12.2010
Сообщений: 161
07.03.2019, 10:34  [ТС]
Жень наконец то сделал
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*Шорткод для категорий на страницах*/
add_shortcode('footag', 'footag_func');
function footag_func( $atts ){
    $atts = shortcode_atts( array(
        'catid' => '62'
    ), $atts, 'footag');
$termID = $atts['catid']; // get_queried_object()->term_id; - динамическое получение ID текущей рубрики
$taxonomyName = "product_cat";
$termchildren = get_term_children( $termID, $taxonomyName );
     if ( isset( $termchildren ) ) {
$termname = get_term( $termID, $taxonomyName );
$thumbnail_id = absint( get_woocommerce_term_meta( $termname->term_id, 'thumbnail_id', true ) );
if ( $thumbnail_id ) {                                                                      
    $image = wp_get_attachment_thumb_url( $thumbnail_id );                                  
} else {                                                                                    
    $image = wc_placeholder_img_src();                                                      
}                                                                                           
$termnameout[] = '<h3><a href=' . get_term_link( $termname->term_id, $termname->taxonomy ) . '>' . $termname->name . '</a></h3>';
foreach ($termchildren as $child) {
    if ( in_array( $child, $termchildren ) ) {
    $term = get_term_by( 'id', $child, $taxonomyName );
            if ($term->parent = $termID) {
    $termlink = get_term_link( $term->term_id, $term->taxonomy );
    $termout[] = '<li><a href=' . $termlink . '>' . $term->name . '</a></li>';
    }}
}
         return '<div class="cat-page"><img src="'. $image .'">'.implode($termnameout).'<ul>' .implode($termout). '</ul></div>';
         
    }
};
Вот рабочий код, все как часы

1. Но так и не могу убрать категорию 3го уровня, читаю матчасть, может что найду

Добавлено через 7 минут
PHP
1
if ($term->parent = $termID)
а эта проверка то почему не работает


PHP
1
$term = get_term_by( 'id', $child, $taxonomyName );
тут же идет подбор массивов исходя из id - $termchildren
тоесть получили 3 массива, из них всего у двух перент совпадает с $termID. Почему он все равно выполняет последний цикл, хотя проверку он по идее не проходит

Добавлено через 2 минуты
Все Жень спасибо!!!!
Туплю сам
PHP
1
if ($term->parent == $termID)
Поставил равно
Синтаксис php будем учить
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
07.03.2019, 11:23
Лучший ответ Сообщение было отмечено toothcomp как решение

Решение

Цитата Сообщение от toothcomp Посмотреть сообщение
Синтаксис php будем учить
Сам иногда с "равно" промахиваюсь с учетом что за день могу на нескольких языках плотно пописать.
И в одном из них обычное одиночное "равно"
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2019, 11:23
Помогаю со студенческими работами здесь

Вывод материалов дочерних категорий на странице родительской категории
Как вывести на странице категории материалы каждой дочерней категории? Приложил фото как должно быть. Есть код: &lt;?php $args =...

Woocommerce шаблон категорий
Где находится шаблон категорий в woocommerce? Файл content-product.php это сам вывод категорий середина шаблона, а перед ним какой идет...

Woocommerce атрибуты товара с иерархией как у категорий
Добрый день! Столкнулся с задачей сделать фильтрацию по атрибутам товара, все бы ничего, если бы не желание заказчика. Он хочет...

Как получить ссылки на страницы категорий товаров Woocommerce
Всем привет. Ломаю голову, как получить ссылки на страницы категории товаров Woocommerce. Хочу получить через массив все ссылки с...

Какой Wordpress -> woocommerce -> export/import plugin для категорий (categories) товаров выбрать?
Добрый день! Ищу долго и упорно как решить следующую задачу. есть: wordpress и woocommerce -&gt; products -&gt; categories...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru