web-dev-qa-db-fra.com

Comment créer une archive pour toutes les publications qui n'ont pas un format de publication?

Le titre dit tout. J'ai besoin d'une pagination fonctionnelle, d'un décompte de messages correct, etc. Fondamentalement, une nouvelle page pour les messages mais avec un filtre pour les formats de messages.

Ce que j'ai essayé jusqu'à présent:

1) Création d'une nouvelle règle de réécriture pour /no-formats/ qui obtient l'id de la page qui charge home.php et ajoute un argument (? No_post_format = vrai). Puis connecté à 'pre_get_posts', a vérifié cet argument et ajouté un tax_query à la requête principale qui exclut toutes les publications avec des formats de publication. Cela n'a pas fonctionné car une règle de réécriture sur la page d'accueil provoque une redirection vers la page d'accueil réelle. So/no-formats/devient/home/et mon argument est perdu.

Pas le code réel, mais pour vous donner une idée de ce que je veux dire:

add_rewrite_rule( 'no-formats/?$', 'index.php?p='. get_option( 'page_for_posts' ) . '&no_post_format=true', 'top' );

2) Création d'une nouvelle page et tentative de réplication du comportement de la page qui affiche les publications et ajout de l'exclusion tax_query mentionnée. Je ne pouvais tout simplement pas trouver un moyen d'obtenir une duplication exacte de la page d'accueil. Peut-être avoir à creuser plus profondément dans WP noyau.

Est-ce que quelqu'un a des idées qui pourraient me pousser dans la bonne direction?

2
Jan Beck

Pour moi, j'avais utilisé une approche légèrement différente:

  1. utilisez un noeud final pour créer une URL du type http://example.com/no-formats/
  2. hooking pre_get_posts pour définir la requête appropriée si nécessaire
  3. filtre template_include pour forcer WP à utiliser home.php au lieu de le dupliquer

Pas plus.

add_action('init', 'add_no_format_endpoint');

function add_no_format_endpoint() {
  add_rewrite_endpoint( 'no-formats', EP_ROOT );
}

add_action('pre_get_posts', 'handle_no_format');

function handle_no_format( $q ) {
  if ( $q->is_main_query() && is_home() && isset( $q->query['no-formats'] ) ) {
    unset( $q->query['no-formats'] );
    $q->is_home = FALSE; // <- add this if you have setted a static page as frontpage
    $tax_q =  array(
      'taxonomy' => 'post_format',
      'field' => 'id',
      'operator' => 'NOT IN',
      'terms' => get_terms( 'post_format', array( 'fields' => 'ids' ) )
    );
    $q->set( 'tax_query', array( $tax_q) );
    add_filter( 'template_include', 'force_home_template', 999 );
  }
}

function force_home_template() {
  return locate_template( array( 'home.php', 'index.php' ), FALSE );
}

N'oubliez pas de visiter Paramètres-> Permaliens dans votre tableau de bord pour vider les règles de réécriture.

3
gmazzap

Modifier

Remarque: vous pouvez utiliser la même technique pour un modèle de page personnalisé , avec une boucle personnalisée via new WP_Query():

// Post Formats
$post_formats_array = array(
    'post-format-aside',
    'post-format-audio',
    'post-format-chat',
    'post-format-gallery',
    'post-format-image',
    'post-format-link',
    'post-format-status',
    'post-format-quote',
    'post-format-video'
);
// Custom query args
$standard_posts_query_args = array(    
    'tax_query' => array(
        array(
            'taxonomy' => 'post_format',
            'field' => 'slug',
            // Use array defined above,
            // or try omitting 'terms' entirely
            'terms' => $post_formats_array,             
            'operator' => 'NOT IN'
        )
    )
);
// Custom query
$standard_posts = new WP_Query( $standard_posts_query_args );

// Custom query loop
if ( $standard_posts->have_posts() ) : while ( $standard_posts->have_posts() ) : $standard_posts->the_post();
    // Loop markup here
endwhile; endif;

Pagination

Pour la pagination, , veuillez vous référer à cette question/réponse .

Réponse originale

Pourquoi ne pas simplement exclure les publications aux formats de publication de l’archive principale des publications?

function wpse129372_filter_posts_archive( $query ) {
    if ( $query->is_main_query && $query->is_archive() ) {
        $post_formats_array = array(
            'post-format-aside',
            'post-format-audio',
            'post-format-chat',
            'post-format-gallery',
            'post-format-image',
            'post-format-link',
            'post-format-status',
            'post-format-quote',
            'post-format-video'
        );
        $tax_query = array(
            array(
                'taxonomy' => 'post_format',
                'field' => 'slug',
                // Use array defined above,
                // or try omitting 'terms' entirely
                'terms' => $post_formats_array,             
                'operator' => 'NOT IN'
            )
        );
        $query->set( 'tax_query', $tax_query );
    }
}
add_action( 'pre_get_posts', 'wpse129372_filter_posts_archive' );

Ceci, associé à (je suppose), des fichiers de modèles personnalisés (ou des modèles de page personnalisés) pour des publications avec des formats de publication, serait un moyen assez simple de n’afficher que les publications "standard" dans l’index des archives.

0
Chip Bennett