用于列出特定类别的帖子标题的短代码

时间:2014-03-07 13:08:00

标签: php wordpress list wordpress-theming shortcode

我在http://codex.wordpress.org/Template_Tags/get_posts找到了这个很棒的代码片段,我编辑了一下以适合我。它有效。

<p>
    <?php


        $args = array( 'posts_per_page' => 0, 'offset'=> 0, 'category' => 1 );

        $myposts = get_posts( $args );
        foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
        <?php the_title(); ?>
        </br>
     <?php endforeach; 
     wp_reset_postdata();?>
</p>

我想将其转换为带有一个可变变量的短代码 - 类别ID。但是,好吧,因为我不知道php,所以我提出的是:

function tytuly_postow($atts) {
   extract(shortcode_atts(array(
      'id' => 1,
   ), $atts));

   $args = array( 'posts_per_page' => 0, 'offset'=> 0, 'category' => $id );
   $q ="<p>
    <?php

$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
    <?php the_title(); ?>
  </br>
<?php endforeach; 
wp_reset_postdata();?>
</p>";
}
add_shortcode('tytuly','lista_postow');  

当然,它不起作用。我使用Karma主题并将其添加到shortcodes.php文件中。请帮助:)

2 个答案:

答案 0 :(得分:1)

您拥有的代码肯定是在正确的轨道上。我就是这样做的:

function tytuly_postow( $atts ) {
   extract( shortcode_atts( array(
      'id' => 1,
   ), $atts ) );

   $posts = get_posts( array(
       'posts_per_page' => -1,
       'post_status'    => 'publish',
       'cat'       => $id,
   ) );

   $output = '';

   if ( $posts ) {
       $output .= '<p>';

       foreach ( $posts as $post ) {
           $output .= apply_filters( 'the_title', $post->post_title ) . '<br />';
       } 

       $output .= '</p>';
   }

   return $output;
}
add_shortcode( 'tytuly', 'tytuly_postow' );  

默认偏移为0,因此您无需将其添加为参数。我将posts_per_page设置为-1。这意味着全部。

由于您只是列出了标题,因此按标题排序可能是有意义的。目前他们将按日期降序排序。

我将输出设置为空字符串并在结尾处返回输出。这意味着无论发生什么,短代码总会返回一些东西,即使这个东西恰好是一个空字符串。

然后我正在检查是否找到了帖子。如果是这样的话,我会在foreach之前和之后添加一个段落标记。这是为了匹配您的原始代码。

最后,它遍历每个帖子并在帖子标题上使用the_title过滤器,然后使用break标记结束每个标题。

答案 1 :(得分:-1)

通过查看Shortcode APIadd_shortcode Function Reference,您可以检查函数add_shortcode的参数是$tag还是$func。 因此,要开始修复代码,您需要修复它:

//[tutuly]
function tytuly_postow($atts) {
    ...
}
add_shortcode('tytuly', 'tytuly_postow'); 

通过这样做,您将获得短代码的工作结构。现在,你的第二个错误是你的函数需要返回一个值,这就是你的短代码将被转换成什么。为此,您需要使用return

编辑:另外,您回复帖子名称的逻辑是错误的,所以我修复了它:

因此,您的固定代码将如下所示:

//[tutuly id="1"]
function tytuly_postow($atts) {
   extract(shortcode_atts(array(
      'id' => 1,
   ), $atts));

   $args = array(
          'posts_per_page' => -1,
          'category'       => $id,
          'post_status'    => 'publish'
   );
   $myposts = get_posts($args);
   if ($myposts) {
          $q = '<p>';
          foreach ($myposts as $post) {
                 $q .= apply_filters('the_title', $post->post_title) . '<br />';
          }
          $q .= '</p>';
   } else {
          $q = '';
   }

   return $q;
}
add_shortcode('tytuly','tytuly_postow');  

posts_per_page现在设置为-1以检索所有帖子, post_status用于仅检索已发布的帖子。

如果您要检索帖子的链接,而不仅仅是名称,则可以更改此行:

$q .= apply_filters('the_title', $post->post_title) . '<br />';

$q .= '<a href=' . get_permalink($post->ID) . '>' . apply_filters('the_title', $post->post_title) . '</a><br />';

请注意,如果您没有足够的编程技能,您可以随时使用真棒GenerateWP Shorcodes Generator