Как создать динамическую постоянную ссылку на список пользовательской таксономии текущих записей?

Вопрос или проблема

Я ищу помощь с проблемой, с которой столкнулся и не могу справиться сам. Я создал свою собственную пользовательскую таксономию под названием серии (код ниже). Я вызываю посты пользовательской таксономии в виджете с помощью плагина “Гибкий виджет постов” (скриншот для виджета ниже и код для плагина ниже).

Это работает нормально и вызывает посты. Но я хочу создать ссылку “Посмотреть все”, которая будет вести к любой “Серии” (моя пользовательская таксономия), которая вызывается в виджете. Я пробовал постоянную ссылку, но она ведет к последнему вызываемому посту, а не на страницу, на которой перечислены все посты под текущей таксономией, которая вызывается в этом виджете. Я ищу способ сделать ссылку на эту страницу и сделать ее динамичной, так как пользовательская таксономия “Серии” будет меняться в зависимости от того, какая серия вызывается в виджете.

Буду очень признателен за советы – я буду очень отзывчив!

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:17

30.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.

Шаги по созданию динамической ссылки на ваш пользовательский таксономии

  1. Обновите ваш код виджета: Вам необходимо заменить строку, которая отвечает за создание ссылки "Просмотреть все". Вместо того, чтобы использовать the_permalink(), используйте функцию get_term_link(). Эта функция возвращает URL-адрес для конкретного термина вашего таксономии.

  2. Пример кода: Вместо строки, которая в настоящее время выглядит так:

<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. Это значительно улучшит навигацию на вашем сайте и позволит пользователям легче находить все посты, связанные с определенным сериалом. Если возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...