2014-09-03 113 views
0

我已創建自定義帖子。我想列出帖子,但我的短代碼不起作用。Wordpress-創建短代碼列出帖子

這裏是我的代碼

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

產品page.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"]

我跟着this tutorial

+0

您需要創建「產品」帖子類型,而不是頁面。 'type'默認爲'product',你也可以在你的例子中指定它。 – doublesharp 2014-09-04 00:08:40

回答

1

你好,你需要添加的所有代碼在你function.php我正在粘貼我的我做了什麼

function.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; 
    } 
} 


?> 

產品page.php文件

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

我認爲這將幫助你。讓我知道如果你想要別的東西

+1

謝謝你的回答。 – hellosheikh 2014-09-07 02:31:21

1

將您的短代碼代碼從product-page.php移到functions.php中。此外,[list-posts type="products" category = "movies" orderby="name" order="ASC"]應該有type="product"因爲您的文章類型是產品。

+0

感謝您的幫助 – hellosheikh 2014-09-07 02:31:38

1

請假ob_*功能,當沒有其他選擇。

WP_Query可以更改爲get_posts()while (has_posts())常規foreach()。唯一的麻煩是post_class(),但核心功能只是一條線,所以很容易適應。另外,extract() is outdated

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; 
} 
0

請勿在短代碼中使用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(); 
}