it-swarm.com.de

Archive für benutzerdefinierte Beitragstypen (ohne Seiten)

Ich möchte das Standardarchiv-Widget so erweitern, dass es nicht nur eine {month: year} -Liste der Standardbeiträge anzeigt, sondern auch meinen neuen benutzerdefinierten Beitragstyp enthält.

Aus diesem Beispiel konnte ich die neuen {month: year} -Elemente in der Archivliste abrufen, ohne mich durchzuklicken.

Anschließend wurde in diesem Beispiel gezeigt, wie Elemente aus benutzerdefinierten Beitragstypen in die Schleife aufgenommen werden und durch Klicken die tatsächlichen Ergebnisse angezeigt werden.

Das letzte Problem, das ich habe, ist jedoch, dass beim Klicken auf das Element {month: year} in der Liste auch Ergebnisse von Seiteneinträgen zurückgegeben werden. Ich muss wissen, wie ich Seiten aus meinen Ergebnissen herausfiltere, damit es nur Post-Typen sind.

Der Code, den ich in functions.php habe, ist:

/**
 * Add custom Post Types to the Archives.
 */
add_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 );
function ucc_getarchives_where_filter( $where , $r ) {
  $args = array(
    'public' => true ,
    '_builtin' => false
  );
  $output = 'names';
  $operator = 'and';

  $post_types = get_post_types( $args , $output , $operator );
  $post_types = array_merge( $post_types , array( 'post' ) );
  $post_types = "'" . implode( "' , '" , $post_types ) . "'";

  return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where );
}

/**
 * Add Custom Post Types to The Loop results.
 */
add_filter( 'request' , 'ucc_request_filter' );
function ucc_request_filter( $query ) {
   // Preview does not like having post_type set; feed is my personal preference.
  if ( empty( $query['preview'] ) && empty( $query['feed'] ) ) {
    $my_post_type = $query['post_type'];
    if ( empty( $my_post_type ) ) {
      $query['post_type'] = 'any';
    }
  }
  return $query;
}
1
Ian

ersetzen:

return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where );

mit:

return str_replace( "post_type = 'post'" , "post_type = 'YOUR_CUSTOM_TYPE'" , $where );

und ändern Sie YOUR_CUSTOM_TYPE in den Namen Ihres tatsächlichen benutzerdefinierten Beitragstyps.

Aktualisieren:

Wenn Sie alle Typen außer Seiten möchten, ändern Sie Ihre Funktion folgendermaßen:

add_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 );
function ucc_getarchives_where_filter( $where , $r ) {
  $args = array(
    'public' => true ,
    '_builtin' => false
  );
  $output = 'names';
  $operator = 'and';

  $post_types = get_post_types( $args , $output , $operator );
  $post_types = array_merge( $post_types , array( 'post' ) );
  $post_types = "'" . implode( "' , '" , $post_types ) . "'";
  //if page is somewhere in the middle then remove it 
  $post_types = str_replace("'page',","",  $post_types);
    //if page is somewhere the last type then remove it 
  $post_types = str_replace("'page'","",  $post_types);
  return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where );
}

und um Ergebnisse in der Schleife zu erhalten, benutze dies:

add_filter( 'pre_get_posts' , 'ucc_include_custom_post_types' );
function ucc_include_custom_post_types( $query ) {
  global $wp_query;

  /* Don't break admin or preview pages. This is also a good place to exclude feed with !is_feed() if desired. */
  if ( !is_preview() && !is_admin() && !is_singular() ) {
    $args = array(
      'public' => true ,
      '_builtin' => false
    );
    $output = 'names';
    $operator = 'and';

    $post_types = get_post_types( $args , $output , $operator );
    $post_types = array_merge( $post_types , array( 'post' ) );

    //remove page form array:
    foreach($post_types as $key => $val){
        if ($val =='page'){
            unset($post_types[$key]);
        }
    }

    if ($query->is_feed) {
      /* Do feed processing here if you did not exclude it previously. This if/else
       * is not necessary if you want custom post types included in your feed.
       */
    } else {
      $my_post_type = get_query_var( 'post_type' );
      if ( empty( $my_post_type ) )
        $query->set( 'post_type' , $post_types );
    }
  }

  return $query;
}
2
Bainternet