Excludeți categoria din bucla WordPress
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;
?>
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);
}
}

î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.

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

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.

Î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

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.

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]';
