在短代码中显示特定类别的帖子标题(wordPress)

时间:2017-04-04 23:13:34

标签: php wordpress shortcode

尝试编写我的第一个短代码,显示特定类别中的所有后期标题。但它没有显示实际结果,只显示短代码。 以下是我目前在我的子主题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个标题,我希望它显示所有标题。有任何想法吗...??感谢。

2 个答案:

答案 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' );