WordPress - 创建一个短代码来列出帖子


Wordpress-Create a shortcode to list posts

我已经创建了自定义帖子。我想列出帖子,但我的短代码不起作用。

这是我的代码

功能.php

// register a custom post type called 'Products'
function wptp_create_post_type() {
    $labels = array(
        'name' => __( 'Products' ),
        'singular_name' => __( 'product' ),
        'add_new' => __( 'New product' ),
        'add_new_item' => __( 'Add New product' ),
        'edit_item' => __( 'Edit product' ),
        'new_item' => __( 'New product' ),
        'view_item' => __( 'View product' ),
        'search_items' => __( 'Search products' ),
        'not_found' =>  __( 'No product Found' ),
        'not_found_in_trash' => __( 'No product found in Trash' ),
    );
    $args = array(
        'labels' => $labels,
        'has_archive' => true,
        'public' => true,
        'hierarchical' => false,
        'supports' => array(
            'title',
            'editor',
            'excerpt',
            'custom-fields',
            'thumbnail',
            'page-attributes'
        ),
        'taxonomies' => array( 'post_tag', 'category' ),
    );
    register_post_type('product', $args );
}
add_action( 'init', 'wptp_create_post_type' );

产品页面.php

add_shortcode( 'list-posts', 'rmcc_post_listing_parameters_shortcode' );
function rmcc_post_listing_parameters_shortcode( $atts ) {
    ob_start();
    extract( shortcode_atts( array (
        'type' => 'product',
        'order' => 'date',
        'orderby' => 'title',
        'posts' => -1,
        'category' => '',
    ), $atts ) );
    $options = array(
        'post_type' => $type,
        'order' => $order,
        'orderby' => $orderby,
        'posts_per_page' => $posts,
        'category_name' => $category,
    );
    $query = new WP_Query( $options );
    if ( $query->have_posts() ) { ?>
            <?php while ( $query->have_posts() ) : $query->the_post(); ?>
            <li id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            </li>
            <?php endwhile;
            wp_reset_postdata(); ?>
        </ul>
    <?php $myvariable = ob_get_clean();
    return $myvariable;
    }   
}

我已经从仪表板创建了一个页面,并选择产品页面作为模板,当我预览或加载页面时,但我看不到我的帖子。

我在我的页面上尝试了以下这些短代码。对我来说什么都行不通

[list-posts]

[list-posts type="products" category = "movies" orderby="name" order="ASC"]

我遵循了本教程

您好,您需要在函数中添加所有代码.php 我正在粘贴我所做的

功能.php

<?php
function wptp_create_post_type() {
    $labels = array(
            'name' => __( 'News' ),
            'singular_name' => __( 'News' ),
            'add_new' => __( 'New News' ),
            'add_new_item' => __( 'Add New News' ),
            'edit_item' => __( 'Edit News' ),
            'new_item' => __( 'New News' ),
            'view_item' => __( 'View News' ),
            'search_items' => __( 'Search News' ),
            'not_found' =>  __( 'No News Found' ),
            'not_found_in_trash' => __( 'No News found in Trash' ),
    );
    $args = array(
            'labels' => $labels,
            'has_archive' => true,
            'public' => true,
            'hierarchical' => false,
            'supports' => array(
                    'title',
                    'editor',
                    'excerpt',
                    'custom-fields',
                    'thumbnail',
                    'page-attributes'
            ),
            'taxonomies' => array( 'post_tag', 'category' ),
    );
    register_post_type('News', $args );
}
add_action( 'init', 'wptp_create_post_type' );

add_shortcode( 'list-posts', 'rmcc_post_listing_parameters_shortcode' );
function rmcc_post_listing_parameters_shortcode( $atts ) {
    ob_start();
    extract( shortcode_atts( array (
    'type' => 'News',
    'order' => 'date',
    'orderby' => 'title',
    'posts' => -1,
    'category' => '',
    ), $atts ) );
    $options = array(
            'post_type' => $type,
            'order' => $order,
            'orderby' => $orderby,
            'posts_per_page' => $posts,
            'category_name' => $category,
    );
    $query = new WP_Query( $options );
    if ( $query->have_posts() ) { ?>
            <?php while ( $query->have_posts() ) : $query->the_post(); ?>
            <li id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            </li>
            <?php endwhile;
            wp_reset_postdata(); ?>
        </ul>
    <?php $myvariable = ob_get_clean();
    return $myvariable;
    }   
}

?>

产品页面.php

 echo do_shortcode('[list-posts]');

我认为这会对你有所帮助。如果您想要其他东西,请告诉我

将短代码的代码从产品页面.php移动到函数.php中。 此外,[list-posts type="products" category = "movies" orderby="name" order="ASC"]应该有type="product",因为您的帖子类型是产品。

ob_*函数留到别无选择的时候。

WP_Query可以更改为get_posts()while ( has_posts() )可以更改为常规foreach()。唯一的麻烦是post_class(),但核心功能只有一条线,所以很容易适应。此外,extract()已经过时了。

add_shortcode( 'list-posts', 'rmcc_post_listing_parameters_shortcode' );
function rmcc_post_listing_parameters_shortcode( $atts ) {
    $args = shortcode_atts( array(
        'type' => 'News',
        'order' => 'date',
        'orderby' => 'title',
        'posts' => -1,
        'category' => '',
    ), $atts );
    $options = array(
        'post_type' => $args['type'],
        'order'     => $args['order'],
        'orderby'   => $args['orderby'],
        'posts_per_page' => $args['posts'],
        'category_name'  => $args['category'],
    );
    $posts = get_posts( $options );
    $html = 'No posts found.';
    if ( $posts ) { 
        $html = '<ul>';
        foreach( $posts as $post ) {
            $html .= sprintf(
                '<li id="post-%s" class="%s"><a href="%s">%s</a></li>',
                $post->ID,
                join( ' ', get_post_class( '', $post->ID ) ), // simplified version of get_class() 
                get_the_permalink( $post->ID ),
                $post->post_title
            );
        }
        $html .= '</ul>';
    }
    return $html;
}

不要在短代码中使用extract()。事实上,extract(),永远不应该使用。这是我最近在WPSE上的另一个答案上所做的一个简码示例。根据需要使用和修改

add_shortcode( 'news_box', 'newsbox_new_loading_shortcode' );
function newsbox_new_loading_shortcode($atts){
    ob_start();
    $a = shortcode_atts( 
        [
            'posts_per_page'    => '-1',
            'news_box_title'    => 'Latest News',
            'news_box_more'     => '',
            'post_type'         => 'post',
            'taxonomy'          => '',
            'terms'             => '',
            'category'          => '',
        ], 
        $atts 
    );
    if( '' == $a['taxonomy'] || '' == $a['terms'] ) {
      if( '' == $a['category'] ) {
        $args = [
            'posts_per_page'    => $a['posts_per_page'],
            'post_type'         => $a['post_type'],
        ];

      }else{
        $args = [
            'posts_per_page'    => $a['posts_per_page'],
            'post_type'         => $a['post_type'],
            'category_name'     => $a['category'],
        ];
     }
    }else{
        $args = [
            'posts_per_page'    => $a['posts_per_page'],
            'post_type'         => $a['post_type'],
            'tax_query'         => [
                [
                    'taxonomy'  => $a['taxonomy'],
                    'field'     => 'slug',
                    'terms'     => $a['terms'],
                ]
            ]
        ];
    }
    //The following lines is for the excerpt more text NEW!!
    if( 'post' != $a['post_type'] && '' != $a['news_box_more'] ){
        $read_more_text = $a['news_box_more'];
    }else {
        $read_more_text = "Read More &raquo;";
    }
    // end of excerpt more text code
    $q = new WP_Query($args);
    if ( $q->have_posts() ) : 
        while($q->have_posts()) : $q->the_post();   
            $newsbox_post_img_src = wp_get_attachment_image_src(get_post_thumbnail_id(), '', false, '' ); 
            // wp_trim_words function NEW!!
            $content = get_the_content();
            $trimmed_content = wp_trim_words( $content, 55, '<a href="'. get_permalink() .'"> ...' . $read_more_text . '</a>' ); 
            // wp_trim_words function
            ?>

            <li class="news-item">
                <table cellpadding="4">
                    <tr>
                        <td>
                            <?php if( !empty($newsbox_post_img_src)) { ?>
                                <img src="<?php echo $newsbox_post_img_src[0]; ?>" width="100" class="img-circle" />
                            <?php } ?>      
                        </td>
                        <td>
                            <?php echo $trimmed_content; // Replaced the_excerpt() ?>
                        </td>
                    </tr>
                </table>
            </li>
        <?php endwhile;
        $list = ob_get_clean();
        return $list;
    endif;
    wp_reset_postdata();
}

要支持 PHP <5.4,您可以对简码函数执行以下操作。

add_shortcode( 'news_box', 'newsbox_new_loading_shortcode' );
function newsbox_new_loading_shortcode($atts){
    ob_start();
    $a = shortcode_atts( 
        array(
            'posts_per_page'    => '-1',
            'news_box_title'    => 'Latest News',
            'news_box_more'     => '',
            'post_type'         => 'post',
            'taxonomy'          => '',
            'terms'             => '',
            'category'          => '',
        ), 
        $atts 
    );
    if( '' == $a['taxonomy'] || '' == $a['terms'] ) {
      if( '' == $a['category'] ) {
        $args = array(
            'posts_per_page'    => $a['posts_per_page'],
            'post_type'         => $a['post_type'],
        );

      }else{
        $args = array(
            'posts_per_page'    => $a['posts_per_page'],
            'post_type'         => $a['post_type'],
            'category_name'     => $a['category'],
        );
     }
    }else{
        $args = array(
            'posts_per_page'    => $a['posts_per_page'],
            'post_type'         => $a['post_type'],
            'tax_query'         => array(
                array(
                    'taxonomy'  => $a['taxonomy'],
                    'field'     => 'slug',
                    'terms'     => $a['terms'],
                ),
            ),
        );
    }
    //The following lines is for the excerpt more text NEW!!
    if( 'post' != $a['post_type'] && '' != $a['news_box_more'] ){
        $read_more_text = $a['news_box_more'];
    }else {
        $read_more_text = "Read More &raquo;";
    }
    // end of excerpt more text code
    $q = new WP_Query($args);
    if ( $q->have_posts() ) : 
        while($q->have_posts()) : $q->the_post();   
            $newsbox_post_img_src = wp_get_attachment_image_src(get_post_thumbnail_id(), '', false, '' ); 
            // wp_trim_words function NEW!!
            $content = get_the_content();
            $trimmed_content = wp_trim_words( $content, 55, '<a href="'. get_permalink() .'"> ...' . $read_more_text . '</a>' ); 
            // wp_trim_words function
            ?>

            <li class="news-item">
                <table cellpadding="4">
                    <tr>
                        <td>
                            <?php if( !empty($newsbox_post_img_src)) { ?>
                                <img src="<?php echo $newsbox_post_img_src[0]; ?>" width="100" class="img-circle" />
                            <?php } ?>      
                        </td>
                        <td>
                            <?php echo $trimmed_content; // Replaced the_excerpt() ?>
                        </td>
                    </tr>
                </table>
            </li>
        <?php endwhile;
        $list = ob_get_clean();
        return $list;
    endif;
    wp_reset_postdata();
}