创建快捷代码仅显示带有CUSTOM_FIELD元的帖子

时间:2017-09-05 作者:Rike

我想创建一个短代码,它只显示具有明确meta\\u值的帖子。我将ACF插件用于不同的元字段。我的帖子类型为“publication”,例如,我只想显示2017年发布的带有此短代码[publication 2017]或publication release Date 2017]的出版物。

function shortcode_display_publication_details(){

$args = array(
    \'post_type\' => \'publication\',
    \'posts_per_page\' => -1,
    \'meta_key\'          => \'release-date\',
    \'meta_value\' => \'2017\',
    \'orderby\'           => \'meta_value\',
    \'order\'             => \'DESC\',
    \'post_status\' => \'publish\'
);

$query = new WP_Query( $args );
while ( $query->have_posts() ) : $query->the_post();
    echo  the_field(\'autor\'). " (" ;
    echo  the_field(\'release-date\'). ") ";
    echo  the_field(\'buch\'). ". ";
    echo \'<b>\' . get_the_title() . \'</b>\'. ", ";
    echo  the_field(\'verleger\'). ". " ;
    if (get_field(\'seiten\')){
    echo  "S. ";
    echo the_field(\'seiten\'). ". <p />" ;
    }
    echo \'<p>\';
    echo \'&nbsp;\';

endwhile;

// Restore original Post Data
wp_reset_postdata();

}
// Register the shortcodes.
add_shortcode( \'publication\', \'shortcode_display_publication_details\' );
此短代码仅显示2017年的出版物。但我不想每年都建立一个额外的短代码。它是如何工作的,我可以创建一个具有自定义meta\\u值的短代码,如[发布年份xxxx]?

非常感谢您的帮助!

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

您需要您的短代码来接受属性。具有属性的短代码如下所示:

[publication year="2017"]
然后在你的add_shortcode 回调函数在函数的第一个参数中接收属性:

function wpse_279094_publication_shortcode( $atts ) {
    echo $atts[\'year\'];
}
add_shortcode( \'publication\', \'wpse_279094_shortcode\' );
您希望能够说明不使用任何属性的用户,因此使用shortcode_atts() 要填充的函数$atts 如果未设置,则使用默认值。在您的用例中,当前年份似乎是一个合乎逻辑的默认值。所以看起来像:

function wpse_279094_publication_shortcode( $atts ) {
    $atts = shortcode_atts( 
        array(
            \'year\' => date(\'Y\')
        ),
        $atts
    );
}
add_shortcode( \'publication\', \'wpse_279094_shortcode\' );
总之,你的代码应该是这样的:

function wpse_279094_publication_shortcode(){
    $atts = shortcode_atts( array( \'year\' => date(\'Y\') ), $atts );

    $args = array(
        \'post_type\'      => \'publication\',
        \'posts_per_page\' => -1,
        \'meta_key\'       => \'release-date\',
        \'meta_value\'     => $atts[\'year\'],
        \'orderby\'        => \'meta_value\',
        \'order\'          => \'DESC\',
        \'post_status\'    => \'publish\'
    );

    $query = new WP_Query( $args );

    ob_start();

    while ( $query->have_posts() ) : $query->the_post();
        echo the_field( \'autor\' ). " (" ;
        echo the_field( \'release-date\' ). ") ";
        echo the_field( \'buch\' ). ". ";
        echo \'<b>\' . get_the_title() . \'</b>\'. ", ";
        echo the_field( \'verleger\' ). ". " ;
        if ( get_field( \'seiten\' ) ) {
            echo "S. ";
            echo the_field( \'seiten\' ). ". <p />" ;
        }
        echo \'<p>\';
        echo \'&nbsp;\';
    endwhile;

    wp_reset_postdata();

    return ob_get_clean();
}
add_shortcode( \'publication\', \'wpse_279094_publication_shortcode\' );
现在您可以使用[publication year="2017"], [publication year="2012"] 获取不同年份的出版物,或[publication] 获取当年的出版物。

还要注意我对您的代码所做的另一项更改。在代码中echo编辑您的输出。短代码需要return 它们的输出,否则内容不会出现在正确的位置。

一种方法是建立一个大字符串:

$output = get_the_title();
$output .= get_the_content();

return $output;
但我觉得这很麻烦。相反,我使用ob_start() 它将“捕获”所有输出,而不将其回显到屏幕上。那么,我return ob_get_clean() 返回捕获的输出。

结束

相关推荐

create shortcodes for posts

$query = new WP_Query(array( \'post_type\' => \'my_posttype\', \'post_status\' => \'publish\', \'posts_per_page\' => -1, \'orderby\' => \'title\', \'order\' => \'ASC\' )); while ($query->have_posts()) {&#