2016-03-21 8 views
1

Ich habe dieses Problem: Ich habe eine eigene Seite mit eigenen Kategorien erstellt. In einem shortcode möchte ich alle Kategorien bekommen und in den Kategorien möchte ich alle Beiträge zu dieser Kategorie haben.Wie erstelle ich einen Shortcode um alle Beiträge in jeder Kategorie anzuzeigen

function innovatiewerkplaats_sort($atts, $content = null){ 

    global $post; 

    $terms = get_terms('innovatiewerkplaats_categories'); // Get all terms of a taxonomy 

    $nieuws = ''; 

    foreach($terms as $term): 
     $nieuws .= '<div class="one"> 
         <h2>Thema <strong>'.$term->name.' id='.$term->term_id.'</strong></h2> 
        <div class="wrapper">'; 

     $category_query_args = array(
      'post_type' => 'innovatiewerkplaats', 
      // 'category' => $term->term_id, 
      'category_name' => $term->name, 
      // 'cat' => $term->term_id, 
     ); 

     query_posts($category_query_args); 

     if(have_posts()) : while (have_posts()) : the_post(); 

      $post_home= get_the_post_thumbnail($page->ID, 'post-home'); 
      $thumb = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), ''); 
      $url = $thumb['0']; 
      $excerpt = get_the_content(); 
      $excerpta = preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $excerpt); 

      // $ter = wp_trim_words(apply_filters('rpwe_excerpt', $excerpta), $args['length'], '…'); 
      $nieuws .= '<a href="'.get_permalink().'" title="'.get_the_title().'" class="one_fourth workplace">'.$term->term_id.'<span class="img" style="background:url('.$url.') no-repeat center center; background-size:cover;"></span><span class="titel">'.get_the_title().'</span><p></p><span class="more">Lees meer</span></a>'; 

     endwhile; endif; 

     $nieuws .='</div></div>'; 

    endforeach; 

    return $nieuws; 
} 

Antwort

2

Hinweis: Verwenden Sie nicht . Verwenden Sie WP_Query oder get_posts.

Bitte werfen Sie einen Blick auf die Diskussion When to use WP_query(), query_posts() and pre_get_posts.

Hier Beispiel Ansatz zu Ihrem Problem, alle Beiträge basierend auf ihrer Kategorie zu generieren, dann über Shortcode für später angezeigt.

  1. Innerhalb einer Funktion, sollten Sie alle Beiträge Abfrage zuerst (wp_query oder get_posts verwenden),
  2. verwandte Kategorie Erhalten von Post-ID innerhalb Abfrage Schleife. Wenn Term Taxonomie, verwenden Sie get_the_terms.
  3. Erstellen Sie ein Array von Abfragedaten mit Schlüssel (in diesem Fall verwenden wir Begriff Slug), um Beiträge zu gruppieren.
  4. Dann nehmen Sie diese Daten für die äußere Schleife, und geben Sie sie mit einfache Schleife.
  5. Erstellen Sie einen Shortcode mit der Funktion add_shortcode (dieser Code verwendet nur einen einfachen Shortcode).

/** Shortcode [my_shortcode_posts] */ 
add_shortcode('my_shortcode_posts', 'so36133962_get_all_posts_by_category'); 

/** 
* All posts by category 
* build query by get_posts 
* 
* @return string|null 
*/ 
function so36133962_get_all_posts_by_category($attr, $content = null) 
{ 
    /** 
    * Build custom query 
    * 
    */ 
    $args = array(
     'post_type'  => 'your-post-type', // set your custom post type 
     'post_status' => 'publish', 
     'posts_per_page' => -1, 
     /** add more arguments such as taxonomy query i.e: 

       'tax_query' => array(array(
        'taxonomy' => 'genre', // set your taxonomy 
        'field' => 'slug', 
        'terms' => array('comedy','drama') // set your term taxonomy 
       )) 
     */ 
    ); 

    $posts = new WP_Query($args); 

    /** 
    * Prepare Posts 
    * 
    */ 
    $result = array(); 

    // The Loop 
    if ($posts->have_posts()) 
    { 
     while ($posts->have_posts()) 
     { 
      $posts->the_post(); 
      /** 
      * Get all item in a term taxonomy 
      * 
      */ 
      $categories = get_the_terms(get_the_ID(), 'your-taxonomy' /* set your term taxonomy */); 
      if (! $categories) 
       continue; 

      foreach ($categories as $key => $category) 
      { 
       $term_name = $category->name; 
       $term_slug = $category->slug; 
       $term_id = $category->term_id; 
      } 

      /** 
      * Set thumbnail background cover 
      * Use Featured Image 
      */ 
      $img_cover = ''; 
      if (has_post_thumbnail()) 
      { 
       $image_url = wp_get_attachment_image_src(get_post_thumbnail_id(get_the_ID())); 
       if (! empty($image_url[0])) 
       { 
        $img_cover = '<span class="img" style="background:url(' . esc_url($image_url[0]) . ') no-repeat center center; background-size:cover;">'; 
       } 
      } 

      /** 
      * Format html content 
      * 
      */ 
      $format = '<a href="%1$s" title="%2$s" class="post-%3$s">%4$s%2$s</span></br><span class="content-%3$s">%5$s</span></br><span class="more">%6$s</span></a>'; 

      /** 
      * Formatted string post content 
      * 
      */ 
      $content = sprintf($format, 
       get_permalink(), 
       get_the_title(), 
       get_the_ID(), 
       $img_cover, 
       get_the_excerpt(), 
       __('Read More', 'text-domain') 
      ); 

      /** 
      * Set an array of each post for output loop 
      * 
      */ 
      $result[ $term_slug ][] = array(
       'post_id'  => get_the_ID(), 
       'post_content' => $content, 
       'term_name' => $term_name, 
       'term_id'  => $term_id 
      ); 
     } 
    } 
    wp_reset_postdata(); // post reset 

    /** 
    * Check existing output 
    * 
    */ 
    if (! $result) 
     return; 

    /** 
    * Output loop 
    * 
    */ 
    $output = ''; 
    foreach ($result as $slug => $data) 
    { 
     $count = count($data); 
     for ($i = 0; $i < $count; $i++) 
     { 
      /** 
      * Set data as object 
      * 
      */ 
      $post = (object) array_map('trim', $data[ $i ]); 

      if (0 == $i) 
      { 
       /** 
       * Set category id and name 
       * 
       */ 
       $output .= '<div id="term-category-' . absint($post->term_id) . '">'; 
       $output .= '<h3>' . esc_html($post->term_name) . '</h3>'; 
      } 

      /** 
      * Set post id and content 
      * 
      */ 
      $output .= '<div id="post-' . absint($post->post_id) . '"><p>' . $post->post_content . '</p></div>'; 
     } 

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

    return $output; // complete 
} 

Sie Elementstrukturen wie Ihre Bedürfnisse ändern können. Beachten Sie, dass Sie mit diesem Code keine doppelten Beiträge in jeder Kategorie erstellen und sicherstellen, dass Sie die Werte wie Posttyp und Taxonomie wie im Code kommentiert ändern. Ich hoffe das hilft.

+0

Danke für den Code und danke für die Erklärung des Codes! Ich habe heute etwas gelernt :) – Nielsvandijkje

+0

@Nielsvandijkje Gern geschehen, viel Glück mit Ihrem Projekt. – Jevuska