Как создать tag.php

23 авг. 2014 г., 12:35:58
Просмотры: 29.6K
Голосов: 4

Как создать шаблон tag.php, который будет работать для всех записей, содержащих метки?

Я создал несколько меток = Еда, Напитки и Фрукты

запись 1 имеет метки Еда и Напитки

запись 2 имеет метки Еда и Фрукты

Как создать отдельную страницу для этих записей с метками?

Мой код выглядит так, но он ничего не показывает.

function get_tags_post($tag_name){
    $original_query = $wp_query;
    $wp_query = null;
    $brand_name = $tag_name;
    $args = array(
        'posts_per_page' => 5, // Количество записей на странице
        'tag' => $brand_name  // Название метки
    );
    $wp_query = new WP_Query( $args );
    if ( have_posts() ) : while (have_posts()) : the_post();
        echo '<li>';
        single_tag_title();
        echo '</li>';
    endwhile; endif;
    $wp_query = null;
    $wp_query = $original_query;
    wp_reset_postdata();
}

Пожалуйста, если кто-то знает, какая часть кода неправильная, подскажите.

0
Все ответы на вопрос 2
0

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

Чтобы создать страницу тега, просто сделайте копию вашего index.php и переименуйте её в tag.php. Вот пример файла tag.php из стандартной темы twentyfourteen, чтобы дать вам представление:

<?php
/**
 * Шаблон для отображения страниц тегов
 *
 * Используется для отображения архивных страниц записей по тегу.
 *
 * @link http://codex.wordpress.org/Template_Hierarchy
 *
 * @package WordPress
 * @subpackage Twenty_Fourteen
 * @since Twenty Fourteen 1.0
 */

get_header(); ?>

    <section id="primary" class="content-area">
        <div id="content" class="site-content" role="main">

            <?php if ( have_posts() ) : ?>

            <header class="archive-header">
                <h1 class="archive-title"><?php printf( __( 'Архивы по тегу: %s', 'pietergoosen' ), single_tag_title( '', false ) ); ?></h1>

                <?php
                    // Показываем необязательное описание термина.
                    $term_description = term_description();
                    if ( ! empty( $term_description ) ) :
                        printf( '<div class="taxonomy-description">%s</div>', $term_description );
                    endif;
                ?>
            </header><!-- .archive-header -->

            <?php
                $counter = 1; //Начинаем счетчик для разметки колонок записей

                // Начинаем цикл.
                while ( have_posts() ) : the_post();

        ?>
                <div class="entry-column<?php echo ( $counter%2  ? ' left' : ' right' ); ?>">

                    <?php get_template_part( 'content', get_post_format() ); ?>

                </div>  

        <?php   

            $counter++; //Обновляем счетчик

            endwhile;

        pietergoosen_pagination();

        else :
                    // Если нет записей, подключаем шаблон "Записей не найдено".
                get_template_part( 'content', 'none' );

                endif;
            ?>
        </div><!-- #content -->
    </section><!-- #primary -->

<?php
get_sidebar( 'content' );
get_footer();

Также ознакомьтесь со следующими ссылками:

ДОПОЛНЕНИЕ

Хотел бы отметить, что ваш код должен быть правильно отформатирован. В текущем виде его сложно читать и отлаживать.

Прочитайте coding-standards/php/#indentation для получения дополнительной информации.

23 авг. 2014 г. 13:04:44
1

Если вы хотите использовать свой собственный wp_query (что, кстати, абсолютно нормально и может применяться, если вы понимаете, что делаете, и используете меры безопасности — например, старайтесь не злоупотреблять $_GET, а если используете, применяйте strip_tags() или (int), если нужно передать только число).

Вы можете выполнить запрос для архива с тегами в index.php (если хотите иметь только один универсальный шаблон для стандартных записей WordPress) или создать файл tags.php в корневой папке шаблона (там, где находятся index.php и другие файлы шаблонов). Этот файл будет идентичен index.php, но срабатывать при переходе на страницы вида: www.webage.com/tag/название-тега

Сначала используйте get_queried_object(); для получения текущего объекта. Рекомендуется сохранить его в переменную для удобства:

$qObject = get_queried_object();

Если работаете в index.php, хорошей практикой будет создать переменную для определения, является ли текущая страница архивом тегов, чтобы использовать это позже:

$isArchiveTag = (($qObject->taxonomy == 'post_tag')?true:false);

Не обязательно создавать эту переменную, если работаете в tag.php.

Теперь, если вы используете wp_query, запрос должен выглядеть так:

$postArgs = array(      
    'post_type'    => 'post',
    'showposts'    => -1,
    'post_status'  => 'publish',
    'parent' => 0,
    'hide_empty' => true,
    'orderby'   => 'date',
    'order' => 'DESC',
    'tag' => (($isArchiveTag)?$qObject->slug:'')            
);
    
$query = new WP_Query($postArgs);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $currentPost = get_post(); // если нужно сохранить данные записи в переменную
            // ваш код здесь
    }
}
wp_reset_postdata();

Для получения названия активного тега можно использовать:

single_tag_title( '', false );

или

$qObject->name;

Чтобы получить все теги в виде объекта WordPress и сохранить их в переменную, используйте:

$tags = get_terms('post_tag');

Удачи! :)

1 февр. 2022 г. 15:23:15
Комментарии

Полагаю, это ответ на более общий вопрос "как создать tag.php", а не на конкретный вопрос здесь?

Rup Rup
4 февр. 2022 г. 15:12:50