Вопрос или проблема
Я ищу помощь с проблемой, с которой столкнулся и не могу справиться сам. Я создал свою собственную пользовательскую таксономию под названием серии (код ниже). Я вызываю посты пользовательской таксономии в виджете с помощью плагина “Гибкий виджет постов” (скриншот для виджета ниже и код для плагина ниже).
Это работает нормально и вызывает посты. Но я хочу создать ссылку “Посмотреть все”, которая будет вести к любой “Серии” (моя пользовательская таксономия), которая вызывается в виджете. Я пробовал постоянную ссылку, но она ведет к последнему вызываемому посту, а не на страницу, на которой перечислены все посты под текущей таксономией, которая вызывается в этом виджете. Я ищу способ сделать ссылку на эту страницу и сделать ее динамичной, так как пользовательская таксономия “Серии” будет меняться в зависимости от того, какая серия вызывается в виджете.
Буду очень признателен за советы – я буду очень отзывчив!
functions.php / Где я регистрирую таксономию
function create_series_hierarchical_taxonomy() {
$labels = array(
'name' => _x( 'серии', 'название таксономии' ),
'singular_name' => _x( 'серия', 'единичное название таксономии' ),
'search_items' => __( 'поиск серий' ),
'all_items' => __( 'все серии' ),
'parent_item' => __( 'родительская серия' ),
'parent_item_colon' => __( 'родительская серия:' ),
'edit_item' => __( 'редактировать серию' ),
'update_item' => __( 'обновить серию' ),
'add_new_item' => __( 'добавить новую серию' ),
'new_item_name' => __( 'новое имя серии' ),
'menu_name' => __( 'серии' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'series' ),
'show_in_rest' => true,
);
register_taxonomy('series', array('post'), $args );
}
Код шаблона гибкого виджета постов, который я отредактировал, чтобы вызвать свои посты
// Блокировать прямые запросы
if ( !defined('ABSPATH') )
die('-1');
echo $before_widget;
if ( !empty($title) )
echo $before_title . $title . $after_title;
if( $flexible_posts->have_posts() ):
?>
<div>
<?php
// Это устанавливает переменную под названием $term - мы будем использовать ее МНОГО для того, что собираемся сделать.
$term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); ?>
<?php while( $flexible_posts->have_posts() ) : $flexible_posts->the_post(); global $post; ?>
<h2><?php echo $term->name; ?></h2><!-- Печатает название термина, как установлено в виджете -->
<a href="<?php the_permalink(); ?>"><p><?php the_title();?></p></a>
<?php endwhile; ?>
</div>
<a href="<?php the_permalink(); ?>">Посмотреть все</a> <!-- Это не ссылается на текущую страницу таксономии "Серии", как я хочу -->
<?php else: // Нет постов ?>
<div class="dpe-flexible-posts no-posts">
<p><?php _e( 'Пусто', 'flexible-posts-widget' ); ?></p>
</div>
<?php
endif; // Конец have_posts()
echo $after_widget;
Скриншот виджета для визуальной справки, если поможет
ОБНОВЛЕНИЕ
Ответ, предоставленный @bdtheme, возвращает это сообщение об ошибке, все еще ищу решение:
( !) Объект класса WP_Error не может быть преобразован в строку в
C:..\wordpress\wp-content\plugins\flexible-posts-widget\views\series-template.php
на строке 46Стек вызовов #ВремяПамятьФункцияМестоположение 10.0005240784{main}(
)…\index.php:0 20.0008243888require(
‘C:..\wordpress\wp-blog-header.php’ )…\index.php:1730.717639617200require_once( ‘C:..\wordpress\wp-includes\template-loader.php’
)…\wp-blog-header.php:19 40.721039663800include(
‘C:..\wordpress\wp-content\themes\hf\front-page.php’
)…\template-loader.php:74 50.892539948680dynamic_sidebar(
)…\front-page.php:95 60.894139952688
call_user_func_array:{C:..\wordpress\wp-includes\widgets.php:743} (
)…\widgets.php : 743 70.894139953272WP_Widget->display_callback(
)…\widgets.php : 743 80.894339963256Flexible_Posts_Widget->widget(
)…\class-wp-widget.php : 372 90.902740010816include(
‘C:..\wordpress\wp-content\plugins\flexible-posts-widget\views\series-template.php’
)…\class-fpw-widget.php : 197
Замените строку
<a href="https://wordpress.stackexchange.com/questions/328132/<?php the_permalink(); ?>">Посмотреть все</a>
на
<a href="https://wordpress.stackexchange.com/questions/328132/<?php echo get_term_link($term,"series'); ?>">Посмотреть все</a>
Справка: Страница Codex
Ответ или решение
Создание динамической ссылки на страницу с постами вашего пользовательского таксономии в виджете WordPress может быть неочевидной задачей. В этом руководстве я покажу вам, как реализовать "Просмотреть все" для вашего пользовательского таксономии series
, используя правильные функции WordPress.
Шаги по созданию динамической ссылки на ваш пользовательский таксономии
-
Обновите ваш код виджета: Вам необходимо заменить строку, которая отвечает за создание ссылки "Просмотреть все". Вместо того, чтобы использовать
the_permalink()
, используйте функциюget_term_link()
. Эта функция возвращает URL-адрес для конкретного термина вашего таксономии. -
Пример кода: Вместо строки, которая в настоящее время выглядит так:
<a href="<?php the_permalink(); ?>">View All</a> <!-- Эта строка неверна -->
Вы должны заменить ее на:
<a href="<?php echo esc_url(get_term_link($term, 'series')); ?>">View All</a>
Полный пример вашего кода виджета
Таким образом, ваш код виджета будет выглядеть примерно так:
// Блокировать прямой доступ
if ( !defined('ABSPATH') ) die('-1');
echo $before_widget;
if ( !empty($title) ) echo $before_title . $title . $after_title;
if( $flexible_posts->have_posts() ):
// Установим переменную $term.
$term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) );
?>
<div>
<h2><?php echo esc_html($term->name); ?></h2>
<?php while( $flexible_posts->have_posts() ) : $flexible_posts->the_post(); global $post; ?>
<a href="<?php the_permalink(); ?>">
<p><?php the_title(); ?></p>
</a>
<?php endwhile; ?>
</div>
<a href="<?php echo esc_url(get_term_link($term, 'series')); ?>">View All</a> <!-- Теперь это правильная ссылка -->
<?php else: // Нет постов ?>
<div class="dpe-flexible-posts no-posts">
<p><?php _e( 'Постов нет', 'flexible-posts-widget' ); ?></p>
</div>
<?php
endif; // Конец have_posts()
echo $after_widget;
Объяснение изменений
- Безопасность: Использование
esc_url()
для безопасного вывода ссылок, что защищает от XSS-атак. - Динамичность: Ссылка на "Просмотреть все" теперь будет правильно вести на страницу, где отображаются все посты для конкретного таксономии
series
, который вы выбираете в виджете. - Проверка ошибок: Убедитесь, что
get_term_link()
не возвращает объект WP_Error. Это может произойти, если вы передали неправильныйslug
или таксономию. Поэтому вы можете добавить проверку на наличие ошибок:
$link = get_term_link($term, 'series');
if ( !is_wp_error($link) ) {
echo '<a href="' . esc_url($link) . '">View All</a>';
} else {
echo '<span>Ошибка получения ссылки.</span>';
}
Заключение
Теперь вы имеете полностью рабочий виджет, который динамически генерирует ссылку "Просмотреть все" для вашего пользовательского таксономии series
. Это значительно улучшит навигацию на вашем сайте и позволит пользователям легче находить все посты, связанные с определенным сериалом. Если возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.