尝试编写我的第一个短代码,显示特定类别中的所有后期标题。但它没有显示实际结果,只显示短代码。
以下是我目前在我的子主题functions.php
文件中的内容:
function posts_in_cat() {
echo '<ul>';
query_posts('cat=3'); while (have_posts()) : the_post();
echo ('<li><a href="' . the_permalink() . '">' . the_title() . '</a></li>');
endwhile;
wp_reset_query();
echo '</ul>';
}
add_shortcode( 'display_posts_in_cat', 'posts_in_cat' );
然后我调用短代码,就像[display_posts_in_cat]
一样。
当我尝试学习这一点时,我们将非常感谢您的帮助。
编辑:我已经让它显示但链接本身正在文本标题前面回显。此外,它不会显示超过10个标题,我希望它显示所有标题。有任何想法吗...??感谢。答案 0 :(得分:0)
首先,避免使用query_posts()
- 效率低下。查看这个SO answer的瘦子。
此外,短代码不应使用echo
语句。仅限短代码返回文本。简而言之,WordPress内部有PHP,它说“当这个特定的短代码输入到编辑器中时,将其替换为从该函数返回的文本。”使用echo
会使您立即将这些语句打印到屏幕上,而不是返回到WordPress,以便它可以继续其常规过程。有关WP Codex的更多信息。
最后,短代码函数需要$atts
作为参数。
所以,尽管如此,以下是我将如何重写你的功能:
<?php
function posts_in_cat( $atts ) {
$atts = shortcode_atts( array(
'cat' => '',
), $atts );
if ( empty( $atts['cat'] ) ) {
// If category provided, exit early
return;
}
$args = array(
'category' => $atts['cat'],
// Disable pagination
'posts_per_page' => -1
);
$posts_list = get_posts( $args );
if ( empty( $posts_list) ) {
// If no posts, exit early
return;
}
$opening_tag = '<ul>';
$closing_tag = '</ul>';
$post_content = '';
foreach ( $posts_list as $post_cat ) {
$post_content .= '<li><a href="' . esc_url( get_permalink( $post_cat->ID ) ) . '">' . esc_html( get_the_title( $post_cat->ID ) ) . '</a></li>';
}
return $opening_tag . $post_content . $closing_tag;
}
add_shortcode( 'display_posts_in_cat', 'posts_in_cat' );
我只是将您echo
的所有内容添加到一些变量中,然后在最后将它们连接起来。另外,如果该类别中没有任何帖子,我在if
语句中添加了提前退出。这样,您就没有空的<ul>
元素使页面混乱。
我也逃过了输出,你可以阅读on the Codex.
答案 1 :(得分:0)
请试试这个:
function posts_in_cat() { ?>
<ul class="posts">
<?php query_posts('cat=3&showposts=50'); while (have_posts()) : the_post();
?>
<li><a href='<?php the_permalink() ?>'><?php the_title(); ?></a></li>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</ul>
<?php
}
add_shortcode( 'display_posts_in_cat', 'posts_in_cat' );