Отображение настраиваемого типа сообщения с шорткодом таксономии / категории

Я работаю над созданием функции шорткода, которая будет отображать пользовательский тип сообщения и фильтровать его по категории / таксономии. Я понял, как создать шорткод и отобразить тип сообщения. Но я не могу заставить его отображать связанные категории таксономии.

Я создал настраиваемый тип сообщения под названием «отзывы». Затем я создал таксономию под названием «категория отзывов». Внутри этой таксономии у меня есть категория под названием «дом для отзывов».

Я хочу иметь возможность использовать шорткод с «testimonial-home» в качестве фильтра для отображения отзывов на домашней странице.

Мой шорткод отлично работает без атрибутов: [list-testimonials] - отображает все отзывы. Но когда я добавляю: [list-testimonials category = "testimonial-home"], ничего не отображается.

Я в тупике. Я так близко, и я уверен, что есть кое-что очень очевидное, что я не замечаю. Любая помощь очень ценится! Спасибо!

Вот моя функция шорткода:

// создаем шорткод с параметрами, чтобы пользователь мог определить, что запрашивается - по умолчанию перечисляются все сообщения в блоге

    add_shortcode( 'list-testimonials', 'post_listing_parameters_shortcode' );
    function post_listing_parameters_shortcode( $atts ) {
    ob_start();

    // define attributes and their defaults
    extract( shortcode_atts( array (
        'type' => 'testimonials',
        'order' => 'date',
        'orderby' => 'title',
        'posts' => -1,
        'category' => '',
    ), $atts ) );

    // define query parameters based on attributes
    $options = array(
        'post_type' => $type,
        'order' => $order,
        'orderby' => $orderby,
        'posts_per_page' => $posts,
        'category_name' => $category,
    );
    $query = new WP_Query( $options );
    if ( $query->have_posts() ) { ?>
    <?php while ( $query->have_posts() ) : $query->the_post(); ?>
    <div
        class="small-12 medium-12 large-4 columns testimonial-column homepage-    testimonial-column">

        <!--HOME PAGE SINGLE TESTIMONIAL CONTAINER-->
        <div
            class="testimonial-container homepage-testimonial-container"  
            id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

            <!--HOME PAGE SINGLE TESTIMONIAL TEXT-->
            <?php if( get_field('testimonial_text') ): ?>
            <div
                 class="testimonial testimonial-textarea">
                    <?php the_field('testimonial_text'); ?>   
            </div>
            <?php endif ?>
            <!--END HOME PAGE SINGLE TESTIMONIAL TEXT-->

            <!--HOME PAGE SINGLE TESTIMONIAL DETAILS-->
            <div
                 class="testimonial-details">

                <!--HOME PAGE SINGLE TESTIMONIAL IMAGE-->
                <?php if( get_field('testimonial_photo') ): ?>
                <img
                     src="<?php the_field('testimonial_photo'); ?>"
                     class="testimonial-photo" />
                <?php endif ?>

                <!--HOME PAGE SINGLE TESTIMONIAL BIO INFO-->
                <div
                    class="testimonial-bio">

                    <!--HOME PAGE SINGLE TESTIMONIAL NAME-->
                    <?php if( get_field('testimonial_name') ): ?>
                    <h5
                        class="testimonial-name">
                            <?php the_field('testimonial_name'); ?> 
                    </h5>
                    <?php endif ?>
                    <!--END HOME PAGE SINGLE TESTIMONIAL NAME-->

                    <!--HOME PAGE SINGLE TESTIMONIAL TITLE-->
                    <?php if( get_field('testimonial_title') ): ?>
                    <p
                       class="testimonial-title">
                           <?php the_field('testimonial_title'); ?>
                    </p>
                    <?php endif ?>
                    <!--END HOME PAGE SINGLE TESTIMONIAL TITLE-->

                    <!--HOME PAGE SINGLE TESTIMONIAL COMPANY-->
                    <?php if( get_field('testimonial_company') ): ?>
                    <p
                       class="testimonial-company">
                           <?php the_field('testimonial_company'); ?>
                    </p>
                    <?php endif ?>
                    <!--END HOME PAGE SINGLE TESTIMONIAL COMPANY-->

                </div>
                <!--END HOME PAGE SINGLE TESTIMONIAL BIO INFO-->

            </div>
            <!--END HOME PAGE SINGLE TESTIMONIAL DETAILS-->

    </div>
    <!--END HOME PAGE SINGLE TESTIMONIAL CONTAINER-->
    </div>
    <!--HOME PAGE TESTIMONIALS COLUMN-->

        <?php endwhile;
        wp_reset_postdata(); ?>
<?php $myvariable = ob_get_clean();
return $myvariable; 
   }    
}

person user5176291    schedule 31.07.2015    source источник
comment
Никогда не используйте extract(). Это действительно проблематично и чрезвычайно сложно отлаживать, поскольку он создает переменные слева направо и по центру на лету. По этим причинам он был удален из ядра и кодекса. Пожалуйста, никогда не используйте extract(). Просто чтобы добавить, вы уверены, что используете встроенные категории или настраиваемую таксономию?   -  person Pieter Goosen    schedule 31.07.2015
comment
Я использую специальную таксономию? Так вот в чем проблема? Я неправильно это называю? Как бы я назвал пользовательскую таксономию? Так будет ли мой шорткод выглядеть как [list-testimonials taxonomy = home-testimonials] ...? Я пробовал это, но безуспешно. Но это не входит в мою функцию шорткода. Так что бы я сделал вместо этого следующее ...   -  person user5176291    schedule 01.08.2015
comment
// определение атрибутов и их значений по умолчанию extract (shortcode_atts (array ('type' = ›'testimonials', 'order' =› 'date', 'orderby' = ›'title', 'posts' =› -1, 'taxonomy '= ›' ',), $ Atts)); // определяем параметры запроса на основе атрибутов $ options = array ('post_type' = ›$ type, 'order' =› $ order, 'orderby' = ›$ orderby, 'posts_per_page' =› $ posts, 'taxonomy_name' = › категория $,);   -  person user5176291    schedule 01.08.2015


Ответы (1)


Я бы начал (если вы еще этого не сделали) с того, чтобы убедиться, что запрос работает «in vivo», то есть сам по себе на странице (а не как шорткод). Затем выполните итерацию оттуда. Поскольку пользовательские таксономии используют множество различных функций и ключевых имен, чем категории, важно сначала протестировать это. Кроме того, излишне педантично: при обращении к настраиваемой таксономии термин для категорий - термин или термины.

Как бы то ни было, пример безупречного пользовательского цикла типа поста:

<?php
$args = array(
    'posts_per_page' => -1,
    'post_type' => 'testimonials', // This is the CPT's slug!
    'tax_query' => array(
        array(
            'taxonomy' => 'testimonial-category', // This is the taxonomy's slug!
            'field' => 'slug',
            'terms' => array('testimonial-home') // This is the term's slug!
        )
    ),
    'order' => 'ASC',
    'orderby' => 'menu_order'
  );
$my_query = new WP_Query( $args );

if($my_query->have_posts()): 
  while($my_query->have_posts()): $my_query->the_post(); ?>
      <li>
        <h3><?php the_title(); ?></h3>
        <?php if($thumbnail): ?>
          <img src="<?php echo $thumbnail[url]; ?>" />
        <?php endif; ?>
        <p><?php the_content(); ?></p>
      </li>
  <?php endwhile; // End while $my_query->have_posts
endif; // End if $my_query->have_posts

wp_reset_postdata(); ?>
person Astockwell    schedule 31.07.2015
comment
Я также думаю, что OP использует настраиваемую таксономию, а не встроенную таксономию category. ;-) - person Pieter Goosen; 31.07.2015