Вопрос или проблема
Я работаю над функцией, в которой просто хочу вывести кнопку, ссылающуюся на конкретный термин. Я использовал get_the_terms
и заставил это работать успешно, но я пробовал get_term
и не добился успеха. Я хочу, чтобы шорткод выглядел так [see_all_products category="bakery"]
и выводил кнопку, ссылающуюся на него.
Вот моя функция на данный момент:
function product_category_button($atts) {
extract(shortcode_atts(array(
'category' => '',
), $atts));
// if( $category ) :
// Vars
$taxonomy = 'product_categories';
$term = get_term( $category, $taxonomy ); //$post->ID
$cat = $term->name;
$parent = $term->parent;
var_dump($cat);
if ($parent == NULL) :
// Vars
$link = get_term_link( $term->slug, $taxonomy);
$html_out="";
$html_out .= '<a class="x-btn x-btn-primary x-btn-global hvr-bounce-to-bottom" href="' . $link . '">' . 'Посмотреть все продукты' . $cat . '</a>';
endif;
return $html_out;
// endif;
}
add_shortcode( 'see_all_products', 'product_category_button' );
На данный момент $link
выдает мне ошибку “Catchable fatal error: Object of class WP_Error could not be converted to string”, а $cat
возвращает NULL
в var_dump
.
Не уверен, может ли это влиять на это, но здесь информация о $parent
была предназначена только для получения родительского термина.
Похоже, вы пытаетесь получить термин по его слагу или имени. get_term()
получает все данные термина по его id. В этом случае используйте get_term_by()
:
function product_category_button($atts) {
extract(shortcode_atts(array(
'category' => '',
), $atts));
// if( $category ) :
// Vars
$taxonomy = 'product_categories';
// Используйте 'name' вместо 'slug', если хотите получить термин по его имени
$term = get_term_by( 'slug' , $category, $taxonomy ); //$post->ID
$cat = $term->name;
$parent = $term->parent;
var_dump($cat);
if ($parent == NULL) :
// Vars
$link = get_term_link( $term->slug, $taxonomy);
$html_out="";
$html_out .= '<a class="x-btn x-btn-primary x-btn-global hvr-bounce-to-bottom" href="' . $link . '">' . 'Посмотреть все продукты' . $cat . '</a>';
endif;
return $html_out;
// endif;
}
add_shortcode( 'see_all_products', 'product_category_button' );
Для дальнейшего чтения ознакомьтесь с codex.
использовать
get_category_link и get_category_by_slug
function product_category_button($atts) {
extract(shortcode_atts(array(
'category_slug' => '',
), $atts));
// if( $category_slug) :
$get_category = get_category_by_slug($category_slug);
$link = get_category_link($get_category);
$html_out="";
$html_out .= '<a class="x-btn x-btn-primary x-btn-global hvr-bounce-to-bottom" href="' . $link . '">' . 'Посмотреть все продукты' . $get_category->name. '</a>';
return $html_out;
// endif;
}
add_shortcode( 'see_all_products', 'product_category_button' );
Ответ или решение
Для того чтобы извлечь конкретный термин из атрибута шорткода, вам необходимо правильно использовать функции WordPress, которые отвечают за работу с терминами. Ваша цель заключается в создании шорткода, который будет выводить кнопку, ссылающуюся на определённую категорию продукции. Давайте подробно разберём решение данной задачи.
Шаг 1: Использование get_term_by()
Для получения термина по его слагу (slug) рекомендуется использовать функцию get_term_by()
, так как функция get_term()
требует ID, а не слага.
Ваш Шорткод
Вот доработанный пример вашей функции шорткода с комментариями:
function product_category_button($atts) {
// Извлечение атрибутов из шорткода
$atts = shortcode_atts(array(
'category' => '',
), $atts);
// Проверка, передан ли атрибут category
if (!empty($atts['category'])) {
// Задаём налогомию
$taxonomy = 'product_categories';
// Получаем термин по слагу
$term = get_term_by('slug', $atts['category'], $taxonomy);
// Проверяем, был ли найден термин
if (is_wp_error($term) || !$term) {
return '<p>Термин не найден.</p>'; // Обработка случая, если термин не найден
}
// Получаем данные термина
$cat = $term->name;
$parent = $term->parent;
// Генерация ссылки на термин
if ($parent == 0) { // Проверяем, является ли термин родительским
$link = get_term_link($term, $taxonomy);
// Проверка, успешен ли был запрос ссылки
if (is_wp_error($link)) {
return '<p>Ошибка при получении ссылки.</p>'; // Обработка ошибок ссылки
}
// Создание HTML блока для кнопки
$html_out = '';
$html_out .= '<a class="x-btn x-btn-primary x-btn-global hvr-bounce-to-bottom" href="' . esc_url($link) . '">' . esc_html('Смотреть все продукты в категории: ' . $cat ) . '</a>';
return $html_out;
} else {
return '<p>Выбранный термин не является родительским.</p>';
}
}
return '<p>Не указана категория.</p>'; // Обработка случая, если не указана категория
}
// Регистрация шорткода
add_shortcode('see_all_products', 'product_category_button');
Объяснение кода
-
Атрибуты шорткода: Используем функцию
shortcode_atts()
для извлечения атрибутов из шорткода. -
Проверка наличия атрибутов: Убедитесь, что атрибут
category
указан и не пустой. -
Получение термина: Используем
get_term_by('slug', $atts['category'], $taxonomy)
, чтобы получить термин по его слагу. -
Обработка ошибок: Проверяем, действительно ли термин был найден, с помощью
is_wp_error()
. -
Получение и проверка ссылки: Получаем ссылку на термин с помощью
get_term_link()
, и также проверяем на наличие ошибок. -
Генерация кнопки: Создаём HTML-код для кнопки, используя функции
esc_url()
иesc_html()
для защиты от XSS.
Заключение
Решение данной задачи требует внимательного отношения к работе с функциями WordPress, чтобы правильно обрабатывать термины и ошибки. Следуйте указанным шагам, чтобы создавать шорткоды, которые будут работать эффективно и без ошибок.