从评论中的讨论到您的问题,下面是我的建议和建议
只是为了在建设性的回答中概括并添加所有内容
在tag
中的参数WP_Query
接受条款slug, 不是name
始终重置自定义WP_Query
, 总是利用wp_reset_postdata()
查询完成后,就在endif
您不能使用tag
作为您的短代码名称,它是reserved name 在Wordpress中
我相信你做事的顺序是导致你头痛的原因。此外,短代码应该return
其输出,而不是echo
信息技术看看Shortcode API 关于如何创建短代码
在检查代码中的任何内容或帖子是否有标记之前,实际上必须先获取当前帖子。没有这个,您的代码将无法工作。所以,首先要做的是打电话给您的全球$post
. 一旦你有了它,你就可以把ID传给get_the_tags
完成后,您的代码应该可以正常工作
下面是一个示例:(警告:未测试)
add_shortcode(\'shortcodetag\', \'tags\');
function tags() {
ob_start();
global $post;
$posttags = get_the_tags( $post->ID );
if ( $posttags )
{
// Loop for each tag the custom post has
foreach($posttags as $tag)
{
$tag_name = ($tag->slug);
// Search for posts with the same tag,
// is a custom type and don\'t return
// the current post
$args = array(
\'post_type\' => \'custom_post\',
\'tag\' => $tag_name,
\'post__not_in\' => array( $post->ID )
);
$query = new WP_Query( $args );
// Make sure we got results
if( $query->have_posts() )
{
// Loop through each returned post
while ( $query->have_posts() )
{
$query->the_post(); // Returns null
//LOOP ELEMENTS
}
wp_reset_postdata();
}
}
}
$myvariable = ob_get_clean();
return $myvariable;
}
EDIT
正如@TomJNowell所建议的,我真的看不到这里使用短代码。你会做一个
do_shortcode
在单个模板中。这与直接调用函数完全相同。
下面是一个示例来演示这一点,如果我正确理解了您的评论,那么我将以一个示例来演示如何使用模板标记显示某些帖子元素
function tags() {
global $post;
$posttags = get_the_tags( $post->ID );
if ( $posttags )
{
// Loop for each tag the custom post has
foreach($posttags as $tag)
{
$tag_name = $tag->slug;
// Search for posts with the same tag,
// is a custom type and don\'t return
// the current post
$args = array(
\'post_type\' => \'custom_post\',
\'tag\' => $tag_name,
\'post__not_in\' => array( $post->ID )
);
$query = new WP_Query( $args );
// Make sure we got results
if( $query->have_posts() )
{
// Loop through each returned post
while ( $query->have_posts() )
{
$query->the_post(); // Returns null
//LOOP ELEMENTS
the_title(); //display post title
if ( has_post_thumbnail() ) { // check if the post has a Post Thumbnail assigned to it.
the_post_thumbnail(); //display the featured image
}
the_content(); //displays the post\'s content
}
wp_reset_postdata();
}
}
}
}