Excludeți categoria din bucla WordPress

7 mar. 2012, 01:37:35
Vizualizări: 28K
Voturi: 6

Am acest cod pentru buclă și trebuie să exclud categoria 4 din această buclă. Aveți sugestii cum pot realiza acest lucru?

Codul care începe bucla

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

    <ol class="item_lists">

        <?php
        // Definim array-ul pentru sfârșitul elementelor
        $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
Toate răspunsurile la întrebare 4
4
13

poți folosi wp_parse_args() pentru a combina argumentele tale cu interogarea implicită

// Definește argumentele implicite ale interogării
global $wp_query;
$defaults = $wp_query->query_vars;

// Argumentele tale personalizate
$args = array('cat'=>-4);

// combină argumentele implicite cu cele personalizate
$args = wp_parse_args( $args, $defaults );

// interoghează postările bazate pe argumentele combinate
query_posts($args);

totuși, cred că o cale mai elegantă este utilizarea acțiunii pre_get_posts(). aceasta modifică interogarea înainte ca aceasta să fie efectuată, astfel încât interogarea nu se execută de două ori.

verifică:

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

bazându-mă pe acel exemplu, pentru a exclude categoria 4 din index, aș pune asta în functions.php:

add_action('pre_get_posts', 'wpa_44672' );

function wpa_44672( $wp_query ) {

    //$wp_query este transmis prin referință. nu este nevoie să returnăm nimic. orice modificări făcute în interiorul acestei funcții vor afecta automat variabila globală

    $excluded = array(4);  //am făcut-o matrice în caz că trebuie să excludem mai mult de una

    // exclude doar pe pagina principală
    if( is_home() ) {
        set_query_var('category__not_in', $excluded);
        //care este doar o manieră mai elegantă de a scrie:
        //$wp_query->set('category__not_in', $excluded);
    }
}
7 mar. 2012 08:15:58
Comentarii

Votează-o pe Helga deoarece a menționat pre_get_posts primul.

Brad Dalton Brad Dalton
4 sept. 2014 08:33:01

în loc de 'category__not_in' sau 'category__in', ai putea folosi 'cat' și o valoare sub formă de string, de exemplu '2,-4'. Astfel, nu doar categoria specificată va fi inclusă/exclusă, ci și subcategoriile acesteia.

honk31 honk31
6 iun. 2019 17:01:40

Doamnă, ați comis o crimă oribilă. Ar trebui să vă simțiți rușinată! Numele funcției "wpa_44672"? Serios? :P

Ares Ares
26 apr. 2020 00:42:53

Chiar trollezi un post de acum 8 ani doar ca să te amuzi de faptul că am folosit un nume de funcție unic cu aproape 0% șanse de conflict cu orice altceva?

helgatheviking helgatheviking
27 apr. 2020 17:18:08
0

Din fișierul tău de funcții

function remove_home_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'cat', '-4' );
    }
}
add_action( 'pre_get_posts', 'remove_home_category' );

Acest cod modifică interogarea înainte ca aceasta să fie executată, fiind cel mai eficient hook pentru a modifica loop-ul în acest caz.

3 sept. 2014 18:56:52
3

Înainte de linia

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

Inserează ceva de genul

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

Aceasta exclude categoria cu ID-ul 4. Așa cum se vede aici

7 mar. 2012 01:46:37
Comentarii

de fapt elimină postările din acea categorie, dar este un fel de portofoliu pe pagina utilizatorului, iar acum paginarea este defectă pe pagina 3.

jimilesku jimilesku
7 mar. 2012 01:50:46

De asemenea, am acest cod personalizat în 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

paginarea apare și pot să dau click pe ea, dar pagina 2 are aceleași postări ca pagina 1, iar pagina 3 arată eroarea 404? Vă rog ajutați-mă :)

jimilesku jimilesku
7 mar. 2012 02:05:11
0

Adam are dreptate. În plus, pentru ca paginarea să funcționeze, ai nevoie de ceva mai mult, cam așa:

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