使用foreach循环一次显示帖子类别

时间:2019-09-16 09:53:43

标签: php wordpress shortcode

我正在尝试显示基于类别的帖子。 我创建了短代码来显示帖子 [knowledge_sharing cat =“ docs” posts_per_page =“ 5”]

代码:-

function cat_post($atts){

// attributes for shortcode
if (isset($atts['cat'])) {$cat = $atts['cat'];} else {return;}
if (isset($atts['posts_per_page'])) {$posts_per_page = $atts['posts_per_page'];} else {$posts_per_page = -1;}

// get the category posts
$category = get_category_by_slug($cat);
if (!is_object($category)) {return;}
$args = array(
    'cat' => $category->term_id,
    'posts_per_page' => $posts_per_page,
    'post_type' => 'knowledgeSharingDocs',
    'order'  => 'DESC'
);
$posts = get_posts($args);

// create the list output
if (count($posts) > 0) {

 $cat_title = get_the_category($posts->ID);
 foreach($cat_title as $cd){
            $output .='<div class="category-name do-title dot-symbol ">' .$cd->cat_name. '</div>';
         }
 $output .= '<div class="category-list">';
   foreach ($posts as $post) {
        $link = get_permalink($post->ID);
        $title = $post->post_title;
        $output .='<div class="category-boxs">';
           $output .='<div class="category-titles"><a href="'.$link.'">' .$title. '</a></div>';
           $output .='<div class="category-decs">' .$post->post_content. '</div>';
        $output .='</div>';

   }
 $output .= '</div>';  
 return $output;
 }
 }

以某种方式,此代码仅显示帖子标题和内容,而不显示类别名称。

我希望输出是这样的: 分类名称 发布1 帖子2 发布3

类别名称仅一次。 预先感谢。

3 个答案:

答案 0 :(得分:0)

您尝试过吗:

  $categories = get_the_category( $post->ID );
  var_dump( $categories ); 

您可以使用 https://developer.wordpress.org/reference/functions/get_the_category/

答案 1 :(得分:0)

您不能在get_the_category()中使用$ posts,因为$ posts是一个包含多个帖子的数组。

首先,您已经有了正确的类别,那么为什么不直接使用它呢?

答案 2 :(得分:0)

这是一个有效的示例,将为您提供帮助。

就像Stefano Pascazi所说的那样,如果您要查询特定类别,则无需使用$cat_title = get_the_category($posts->ID);,因为查询仅返回特定类别。

但是,如果该类别存在任何子类别,我们可以通过使用以下示例拆分所有类别来显示帖子。

function cat_post($atts){

    // attributes for shortcode
    if (isset($atts['cat'])) {$cat = $atts['cat'];} else {return;}
    if (isset($atts['posts_per_page'])) {$posts_per_page = $atts['posts_per_page'];} else {$posts_per_page = -1;}

    // get the category posts
    $category = get_category_by_slug($cat);
    if (!is_object($category)) {return;}
    $args = array(
        'cat' => $category->term_id,
        'posts_per_page' => $posts_per_page,
        'post_type' => 'knowledgeSharingDocs',
        'order'  => 'DESC'
    );
    $posts = get_posts($args);

    $output = "";
    if (count($posts) > 0) {

        $op = array();  
        foreach ($posts as $post) { 

            $pdata = '';
            $link = get_permalink($post->ID);
            $title = $post->post_title;
            $pdata .='<div class="category-boxs">';
               $pdata .='<div class="category-titles"><a href="'.$link.'">' .$title. '</a></div>';
               $pdata .='<div class="category-decs">' .$post->post_content. '</div>';
            $pdata .='</div>';

            $cat_title = get_the_category($post->ID);
            $cat_slug = $cat_title[0]->slug;

            if( !isset($op[$cat_slug]) )
                $op[$cat_slug] = array('first' => '<div class="category-name do-title dot-symbol ">' .$cat_title[0]->cat_name. '</div><div class="category-list">', 'middle' => $pdata, 'last' => '</div>');        
            else
                $op[$cat_slug]['middle'] = $op[$cat_slug]['middle'].$pdata;

        }

        $output = implode('', array_map(function ($entry) {
            return $entry['first'].$entry['middle'].$entry['last'];
        }, $op)); 
    }
    return $output;

}

add_shortcode( 'knowledge_sharing', 'cat_post' ); 

echo do_shortcode( '[knowledge_sharing cat="blog" posts_per_page="5"]' );