如何创建短代码以显示每个类别中的所有帖子

时间:2016-03-21 14:37:37

标签: php wordpress shortcode

我遇到了这个问题:我使用自己的一组类别创建了一个自定义页面。在短代码中,我希望获得所有类别,并且在类别中,我希望所有与该类别相关的帖子。

function innovatiewerkplaats_sort($atts, $content = null){

    global $post;

    $terms = get_terms('innovatiewerkplaats_categories'); // Get all terms of a taxonomy

    $nieuws = '';

    foreach($terms as $term):
        $nieuws .= '<div class="one">
                        <h2>Thema <strong>'.$term->name.' id='.$term->term_id.'</strong></h2>
                    <div class="wrapper">';

        $category_query_args = array(
            'post_type' => 'innovatiewerkplaats',
            // 'category' => $term->term_id,
            'category_name' => $term->name,
            // 'cat'  => $term->term_id,
        );

        query_posts($category_query_args);

        if( have_posts() ) : while (have_posts()) : the_post();

            $post_home= get_the_post_thumbnail( $page->ID, 'post-home');
            $thumb = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), '' );
            $url = $thumb['0'];
            $excerpt = get_the_content();
            $excerpta = preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $excerpt);

            // $ter = wp_trim_words( apply_filters( 'rpwe_excerpt', $excerpta ), $args['length'], '…' );
            $nieuws .= '<a href="'.get_permalink().'" title="'.get_the_title().'" class="one_fourth workplace">'.$term->term_id.'<span class="img" style="background:url('.$url.') no-repeat center center; background-size:cover;"></span><span class="titel">'.get_the_title().'</span><p></p><span class="more">Lees meer</span></a>';

        endwhile; endif;

        $nieuws .='</div></div>';

    endforeach;

    return $nieuws;
}

1 个答案:

答案 0 :(得分:2)

注意:请勿使用query_post。使用WP_Queryget_posts

请查看When to use WP_query(), query_posts() and pre_get_posts

此处示例方法与您的问题相关,根据其类别生成所有帖子,然后通过短代码显示以供日后使用。

  1. 在函数内部,您应首先查询所有帖子(使用wp_queryget_posts),
  2. 在查询循环中按帖子ID获取相关类别。如果是术语分类,请使用get_the_terms
  3. 使用密钥构建一个查询数据数组(在本例中,我们使用term slug)来对帖子进行分组。
  4. 然后将这些数据用于外部循环,并输出它们 简单循环。
  5. 按功能add_shortcode构建一个短代码(此代码仅使用简单的短代码)。
  6. /** Shortcode [my_shortcode_posts] */
    add_shortcode( 'my_shortcode_posts', 'so36133962_get_all_posts_by_category' );
    
    /**
     * All posts by category
     * build query by get_posts
     *
     * @return string|null
     */
    function so36133962_get_all_posts_by_category( $attr, $content = null )
    {
        /**
         * Build custom query
         *
         */
        $args = array(
            'post_type'      => 'your-post-type', // set your custom post type
            'post_status'    => 'publish',
            'posts_per_page' => -1,
            /** add more arguments such as taxonomy query i.e:
    
                    'tax_query' => array( array(
                        'taxonomy' => 'genre', // set your taxonomy
                        'field'    => 'slug',
                        'terms'    => array( 'comedy','drama' ) // set your term taxonomy
                    ) )
            */
        );
    
        $posts = new WP_Query( $args );
    
        /**
         * Prepare Posts
         *
         */
        $result = array();
    
        // The Loop
        if ( $posts->have_posts() )
        {
            while ( $posts->have_posts() )
            {
                $posts->the_post();
                /**
                 * Get all item in a term taxonomy
                 *
                 */
                $categories = get_the_terms( get_the_ID(), 'your-taxonomy' /* set your term taxonomy */ );
                if ( ! $categories )
                    continue;
    
                foreach ( $categories as $key => $category )
                {
                    $term_name = $category->name;
                    $term_slug = $category->slug;
                    $term_id   = $category->term_id;
                }
    
                /**
                 * Set thumbnail background cover
                 * Use Featured Image
                 */
                $img_cover = '';
                if ( has_post_thumbnail() )
                {
                    $image_url = wp_get_attachment_image_src( get_post_thumbnail_id( get_the_ID() ) );
                    if ( ! empty( $image_url[0] ) )
                    {
                        $img_cover = '<span class="img" style="background:url( ' . esc_url( $image_url[0] ) . ' ) no-repeat center center; background-size:cover;">';
                    }
                }
    
                /**
                 * Format html content
                 *
                 */
                $format = '<a href="%1$s" title="%2$s" class="post-%3$s">%4$s%2$s</span></br><span class="content-%3$s">%5$s</span></br><span class="more">%6$s</span></a>';
    
                /**
                 * Formatted string post content
                 *
                 */
                $content = sprintf( $format,
                    get_permalink(),
                    get_the_title(),
                    get_the_ID(),
                    $img_cover,
                    get_the_excerpt(),
                    __( 'Read More', 'text-domain' )
                );
    
                /**
                 * Set an array of each post for output loop
                 *
                 */
                $result[ $term_slug ][] = array(
                    'post_id'      => get_the_ID(),
                    'post_content' => $content,
                    'term_name'    => $term_name,
                    'term_id'      => $term_id
                );
            }
        }
        wp_reset_postdata(); // post reset
    
        /**
         * Check existing output
         *
         */
        if ( ! $result )
            return;
    
        /**
         * Output loop
         *
         */
        $output = '';
        foreach ( $result as $slug => $data )
        {
            $count = count( $data );
            for ( $i = 0; $i < $count; $i++ )
            {
                /**
                 * Set data as object
                 *
                 */
                $post = ( object ) array_map( 'trim', $data[ $i ] );
    
                if ( 0 == $i )
                {
                    /**
                     * Set category id and name
                     *
                     */
                    $output .= '<div id="term-category-' . absint( $post->term_id ) . '">';
                    $output .= '<h3>' . esc_html( $post->term_name ) . '</h3>';
                }
    
                /**
                 * Set post id and content
                 *
                 */
                $output .= '<div id="post-' . absint( $post->post_id ) . '"><p>' . $post->post_content . '</p></div>';
            }
    
            $output .= '</div>';
        }
    
        return $output; // complete
    }
    

    您可以根据需要更改元素结构。请注意,使用此代码,每个类别中都没有重复的帖子,并确保您更改了代码中注释的帖子类型和分类法等值。我希望这会有所帮助。