如何将此PHP代码段转换为Wordpress短代码?

时间:2017-09-10 21:17:06

标签: php wordpress

这是一个有多个艺术家页面的音乐网站 - 每位艺术家一页。新内容将添加为带有Wordpress标记的帖子,以表示艺术家。这样我就可以在每个艺术家页面上添加一个Wordpress循环,以显示使用该艺术家标签过滤的所有帖子。

我已经使过滤后的循环正常工作,但不幸的是,它目前在页面模板的HTML中已经写好了,所以它只对一个标签进行过滤。我不想为每位艺术家创建新的页面模板,因此我想将其添加到我的 functions.php 文件中,而我可以为每位艺术家创建一个新的短代码。

以下是我的网页模板中的当前代码,该代码使用 seefour 标记过滤所有帖子的循环:

<?php
query_posts( "tag=seefour" );
if ( have_posts() ) { ?>
  <?php while ( have_posts() ) { ?>
    <?php the_post(); { ?>
    <div class="jd-box">
      <a href="<?php the_permalink(); ?>">
        <?php the_post_thumbnail( ); ?>
        <div class="jd-overlay"></div>
        <div class="jd-overlay-text">
          <?php the_title(); ?>
        </div>
      </a>
    </div>
<?php } ?>
<?php } ?>
<?php } ?>

我认为最佳选择是将其转换为 functions.php 文件中的 seefour 短代码 - 我该如何实现?

奖金问题:从长远来看这是否具有可持续性(有30-50位艺术家)还是会造成大量冗余代码?愿意接受建议......

P.S。我知道这个问题已经得到了解答(从原始PHP开始),但由于我开始混合使用HTML / PHP(我是一个PHP新手),我只是无法让它工作。所以我再次向你道歉。

2 个答案:

答案 0 :(得分:2)

首先,你永远不应该使用query_posts()。它是内部WordPress函数,用于创建和维护主WordPress循环。使用它,您可以以不可预测的方式崩溃您的网站。您应该使用get_posts()WP_Query代替。

要获得自定义短代码,请将以下内容添加到您的functions.php中:

function showtag_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'tag' => '', // Default value.
    ), $atts );

    $posts = get_posts( 'tag=' . $atts['tag'] );
    if ( $posts ) {
        $output = '';
        foreach ( $posts as $post ) {
            setup_postdata( $post );
            $output .= '<div class="jd-box">';
            $output .= '<a href="' . get_the_permalink( $post ) . '">';
            $output .= get_the_post_thumbnail( $post );
            $output .= '<div class="jd-overlay"></div>';
            $output .= '<div class="jd-overlay-text">';
            $output .= get_the_title( $post );
            $output .= '</div>';
            $output .= '</a>';
            $output .= '</div>';
        }
    } else {
        $output = 'no data';
    }
    wp_reset_postdata();

    return $output;
}

add_shortcode( 'showtag', 'showtag_shortcode' );

此函数使用一个参数创建[showtag]短代码:tag。您可以在任何页面上使用此短代码,如下所示:

[showtag tag="seefour"]
[showtag tag="disco"]

等。您将拥有包含相关标签的帖子,以代替您的短代码。

答案 1 :(得分:0)

在短代码中放置一个完整的循环会使它变得混乱,我知道你也可以在Widgets等中使用短代码,但我想这不是你想要的。

如果是这样,最好的选择是将此代码设为页面模板Artist并传递URL中的变量,即http://example.com/artist?t=seefour,然后在页面模板中使用以下代码。

<?php
/**
 * Template Name: Artist
 */

query_posts( "tag=" . $_GET['t'] );
if ( have_posts() ) {
?>
  <?php while ( have_posts() ) { ?>
    <?php the_post(); { ?>
    <div class="jd-box">
      <a href="<?php the_permalink(); ?>">
        <?php the_post_thumbnail( ); ?>
        <div class="jd-overlay"></div>
        <div class="jd-overlay-text">
          <?php the_title(); ?>
        </div>
      </a>
    </div>
<?php
    }
  }
}
?>

这可以用于任何数量的艺术家,完全灵活,因为它依赖于在运行时(访问时)提供的变量。