web-dev-qa-db-fra.com

Archives pour les types de publication personnalisés (sans pages)

Je cherche essentiellement à étendre le widget d’archives par défaut pour qu’il affiche non seulement une liste {mois: année} des publications par défaut, mais qu'il comprenne également mon nouveau type de publication personnalisé.

De cet exemple , j’ai pu obtenir les nouveaux éléments {mois: année} apparaissant dans la liste d’archives, mais sans cliquer sur rien.

Ensuite , cet exemple a montré comment inclure des éléments de types de publication personnalisés dans la boucle et leur permettre de cliquer et de renvoyer les résultats réels.

Cependant, le dernier problème que j'ai est que lorsque vous cliquez sur l'élément {month: year} dans la liste, il renvoie également les résultats des entrées de page. J'ai besoin de savoir comment filtrer les pages de mes résultats, il ne s'agit donc que de types de publication.

Le code que j'ai dans functions.php est:

/**
 * 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

remplacer:

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

avec:

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

et remplacez YOUR_CUSTOM_TYPE par le nom de votre type de message personnalisé.

Mettre à jour:

Si vous voulez tous les types sauf les pages, changez votre fonction à ceci:

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

et pour obtenir des résultats dans la boucle, utilisez ceci:

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