Escludere la categoria dal loop di WordPress

7 mar 2012, 01:37:35
Visualizzazioni: 28K
Voti: 6

Ho questo codice per il loop e ho bisogno di escludere la categoria 4 da questo loop. Qualche suggerimento su come realizzarlo?

Codice che avvia il loop

<?php if(have_posts()): ?>

    <ol class="item_lists">

        <?php
        $end = array(3,6,9,12,15,18,21,24,27,30,33,36,39,42,45);
        $i = 0;

        while (have_posts()) : the_post();
           $i++;
           global $post;
 ?>
0
Tutte le risposte alla domanda 4
4
13

potresti usare wp_parse_args() per unire i tuoi argomenti alla query predefinita

// Definisci gli argomenti predefiniti della query
global $wp_query;
$defaults = $wp_query->query_vars;

// I tuoi argomenti personalizzati
$args = array('cat'=>-4);

// unisci gli argomenti predefiniti con quelli personalizzati
$args = wp_parse_args( $args, $defaults );

// esegui la query basata sugli argomenti uniti
query_posts($args);

tuttavia, penso che la strada più elegante sia utilizzare l'azione pre_get_posts(). questa modifica la query prima che venga eseguita, evitando così di eseguirla due volte.

dai un'occhiata a:

http://codex.wordpress.org/Custom_Queries#Category_Exclusion

basandoti su quell'esempio, per escludere la categoria 4 dall'indice inseriresti questo nel tuo functions.php:

add_action('pre_get_posts', 'wpa_44672' );

function wpa_44672( $wp_query ) {

    //$wp_query è passato per riferimento. non è necessario restituire nulla. qualsiasi modifica fatta all'interno di questa funzione influenzerà automaticamente la variabile globale

    $excluded = array(4);  //trasformato in array nel caso tu debba escludere più di una categoria

    // escludi solo nella home page
    if( is_home() ) {
        set_query_var('category__not_in', $excluded);
        //che è semplicemente il modo più elegante per scrivere:
        //$wp_query->set('category__not_in', $excluded);
    }
}
7 mar 2012 08:15:58
Commenti

Vota a favore di Helga poiché ha menzionato per prima pre_get_posts.

Brad Dalton Brad Dalton
4 set 2014 08:33:01

invece di 'category__not_in' o 'category__in', potresti usare 'cat' e utilizzare una stringa come valore ad es. '2,-4'. in questo modo, non solo la categoria specificata verrebbe inclusa/esclusa, ma anche le sue sottocategorie.

honk31 honk31
6 giu 2019 17:01:40

Signorina, ha commesso un crimine orribile. Dovrebbe vergognarsi! Nome della funzione "wpa_44672"? Davvero? :P

Ares Ares
26 apr 2020 00:42:53

Stai davvero trollando un post di 8 anni fa per prendere in giro il fatto che ho usato un nome di funzione unico con quasi lo 0% di possibilità di conflitto con qualsiasi altra cosa?

helgatheviking helgatheviking
27 apr 2020 17:18:08
0

Dal tuo file functions.php

function remove_home_category( $query ) {
    // Se la query è per la home page ed è la query principale
    if ( $query->is_home() && $query->is_main_query() ) {
        // Esclude la categoria con ID 4 dai risultati
        $query->set( 'cat', '-4' );
    }
}
// Aggiunge l'azione al hook 'pre_get_posts' per modificare la query prima che venga eseguita
add_action( 'pre_get_posts', 'remove_home_category' );

Questo codice modifica la query prima che venga effettivamente eseguita, rendendolo l'hook più efficiente per modificare il loop in questo caso.

3 set 2014 18:56:52
3

Prima della riga

<?php if(have_posts()): ?>

Inserisci qualcosa come questo

<?php query_posts($query_string . '&cat=-4'); ?>

Questo esclude la categoria con ID Categoria 4. Come visto qui

7 mar 2012 01:46:37
Commenti

in effetti rimuove i post da quella categoria ma è una sorta di portfolio nella pagina dell'utente, e ora l'impaginazione è rotta alla pagina 3.

jimilesku jimilesku
7 mar 2012 01:50:46

ho anche questo codice personalizzato nel file theme_setup.php: $newrules["user/({$author->nicename})/(portfolio)/?$"] = 'index.php?author_name=$matches[1]&baction=$matches[2]'; $newrules["user/({$author->nicename})/(portfolio)/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&baction=$matches[2]&paged=$matches[3]';

jimilesku jimilesku
7 mar 2012 01:51:00

l'impaginazione appare e posso cliccarla, ma la pagina 2 mostra gli stessi post della pagina 1, e la pagina 3 mostra un errore 404? Per favore aiutatemi :)

jimilesku jimilesku
7 mar 2012 02:05:11
0

Adam ha ragione. Inoltre, per far funzionare la paginazione, è necessario avere qualcosa di più simile a questo:

<?php query_posts('post_type=post&paged='.$paged.'&cat=-4');  ?>
7 mar 2012 04:39:20