我遇到了这个问题:我使用自己的一组类别创建了一个自定义页面。在短代码中,我希望获得所有类别,并且在类别中,我希望所有与该类别相关的帖子。
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;
}
答案 0 :(得分:2)
注意:请勿使用query_post
。使用WP_Query
或get_posts
。
请查看When to use WP_query(), query_posts() and pre_get_posts。
此处示例方法与您的问题相关,根据其类别生成所有帖子,然后通过短代码显示以供日后使用。
wp_query
或get_posts
),get_the_terms
。add_shortcode
构建一个短代码(此代码仅使用简单的短代码)。/** 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
}
您可以根据需要更改元素结构。请注意,使用此代码,每个类别中都没有重复的帖子,并确保您更改了代码中注释的帖子类型和分类法等值。我希望这会有所帮助。