在简码 (wordPress) 的特定类别中显示 post 个标题

Displaying post titles in a specific category in a shortcode (wordPress)

尝试编写我的第一个 short-code,显示特定类别中的所有 post-titles。但它不显示实际结果,只显示短代码。 这是我目前在 child 主题的 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]

在我尝试学习这个过程中,任何帮助将不胜感激。

编辑:我已经让它显示了,但是 link 本身在文本标题前面 echo-ed。此外,它显示的标题不超过 10 个,我希望它显示所有标题。有任何想法吗...??谢谢

首先,避免使用 query_posts() – 它效率低下。看看这个 SO answer 适合瘦子。

此外,短代码不应使用 echo 语句。仅简码 return 文本。简而言之,WordPress 内部有 PHP 表示 "when this specific shortcode is entered into the editor, replace it with the text returned from this function." 使用 echo 会使您立即将这些语句打印到屏幕上,而不是 returning 到 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' );

我只是将您 echoing 的所有内容添加到一些变量中,然后在最后 returning 将它们连接起来。此外,我在 if 语句中添加了一个语句,以便在该类别中没有任何帖子时提前退出。这样你就没有空的 <ul> 元素使页面混乱。

我也转义了输出,你可以阅读on the Codex.

请试试这个:

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