Ottenere post dalle categorie figlie usando l'ID della categoria genitore

25 nov 2014, 14:26:07
Visualizzazioni: 20.9K
Voti: 3

Ho un plugin che mostra i post da una categoria selezionata. Quando vengono scelte le categorie figlie funziona perfettamente. Tuttavia quando scelgo una categoria genitore, non visualizza nessun post dalle categorie figlie.

Spero che questo sia lo snippet che deve essere modificato, ma non ne sono sicuro.

Sarebbe bello se qualcuno potesse aiutarmi.

<ul>

<?php 
   query_posts(array(
      'post_type' => 'post', 
      'category__in' => $text, // ID delle categorie da includere
      'orderby' => 'meta_value_num', // Ordina per valore numerico del meta
      'meta_key' => 'rankk', // Chiave meta per l'ordinamento
      'order' => 'DESC', // Ordinamento decrescente
      'posts_per_page' => 100 // Numero di post da visualizzare
   )); 
?>
5
Commenti

I plugin scritti male portano sempre a qualche disastro prima o poi. Secondo me, elimina quel plugin e scrivi il tuo codice o trova un plugin scritto correttamente. Non ha senso cambiare la gomma bucata quando l'intera macchina è da rottamare :-)

Pieter Goosen Pieter Goosen
25 nov 2014 14:30:26

Vorrei essere in grado di farlo ;-)

nanonano nanonano
25 nov 2014 14:35:30

Ad essere onesti, modificare il codice di un plugin è una pessima pratica. Quando parli di selezione della categoria genitore, hai bisogno dei post dalla categoria genitore e dei post dalle sue categorie figlie?

Pieter Goosen Pieter Goosen
25 nov 2014 14:45:13

esatto! I genitori sono comunque vuoti.

nanonano nanonano
25 nov 2014 15:00:45

AFAIK 'category__in', non mostra i figli dalle categorie genitore. Ma non so neanche cos'altro usare.

nanonano nanonano
25 nov 2014 16:15:33
Tutte le risposte alla domanda 2
6
11

Come ho già detto nei miei commenti alla tua domanda

I plugin scritti male portano sempre a qualche disastro prima o poi. Secondo me, elimina quel plugin e scrivi il tuo codice o trova un plugin scritto correttamente. Non ha senso cambiare la gomma bucata quando l'intera macchina è da rottamare :-)

Per iniziare, non usare mai query_posts

Nota: Questa funzione non è pensata per essere usata da plugin o temi. Come spiegato più avanti, ci sono opzioni migliori e più performanti per alterare la query principale. query_posts() è un modo troppo semplicistico e problematico per modificare la query principale di una pagina sostituendola con una nuova istanza della query. È inefficiente (riesegue query SQL) e fallirà completamente in alcune circostanze (specialmente spesso quando si ha a che fare con l'impaginazione dei post).

Saresti molto meglio a scrivere il tuo codice e abbandonare quel plugin. Puoi anche unire il plugin corrente (solo il codice "buono") con il codice che ti fornirò nel tuo plugin personale se necessario.

Non dovresti mai fare modifiche ai file di plugin/temi di cui non sei l'autore. La ragione principale è che, al momento dell'aggiornamento, perderai tutte le tue personalizzazioni. Piuttosto crea il tuo plugin o fai le modifiche in un child theme.

Quello che vuoi ottenere non è fattibile con i parametri delle categorie attuali. La tua migliore opzione qui sarà usare un tax_query con WP_Query. Con un tax_query, per impostazione predefinita, i termini figli sono inclusi nel termine impostato, ed è proprio questo che stai cercando.

Puoi provare il seguente codice (NOTA BENE: richiede PHP 5.4+)

$args = [
      'post_type' => 'post', 
      'orderby' => 'meta_value_num', 
      'meta_key' => 'rankk', 
      'order' => 'DESC', 
      'posts_per_page' => 100,
      'tax_query' => [
            [
                'taxonomy' => 'category',
                'field'    => 'term_id',
                'terms'    => 'IL TUO ID CATEGORIA GENITORE',
            ],
        ],
];

$q = new WP_Query( $args );

if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        the_title();
    }
    wp_reset_postdata();
} 

Per versioni di PHP precedenti alla 5.4 prova questo

$args = array(
      'post_type' => 'post', 
      'orderby' => 'meta_value_num', 
      'meta_key' => 'rankk', 
      'order' => 'DESC', 
      'posts_per_page' => 100,
      'tax_query' => array(
            array(
                'taxonomy' => 'category',
                'field'    => 'term_id',
                'terms'    => 'IL TUO ID CATEGORIA GENITORE',
            ),
        ),
);

$q = new WP_Query( $args );

if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        the_title();
    }
    wp_reset_postdata();
} 
25 nov 2014 16:52:51
Commenti

Ho provato a usare il tuo suggerimento, ma non ho conoscenze di PHP :/. Potrei pagarti per sistemarlo? (speravo ci fosse un'opzione per i messaggi privati)

nanonano nanonano
25 nov 2014 17:26:34

Scusa, c'è un piccolo errore di sintassi nel mio codice. Vedi il mio aggiornamento

Pieter Goosen Pieter Goosen
25 nov 2014 17:32:26

Ricevo un errore fatale (ho i Backup per sicurezza). Dovrei sostituire 'YOUR PARENT CATEGORY ID' con $text?

nanonano nanonano
25 nov 2014 17:46:14

Beh, se vuoi continuare a usare il plugin e modificarlo (cosa che non consiglio affatto), allora sì

Pieter Goosen Pieter Goosen
25 nov 2014 17:52:13

Ce l'ho fatta! Ho modificato il tuo codice.

nanonano nanonano
26 nov 2014 01:28:50

Grazie per la modifica suggerita. Ora capisco dove era il tuo problema e avrei dovuto aggiungere una nota al riguardo: la sintassi nel mio codice è supportata solo da PHP versione 5.4 e successive. Nelle versioni precedenti otterrai un errore fatale. Nelle versioni precedenti dovresti usare array() mentre in 5.4+ puoi semplicemente usare [] :-)

Pieter Goosen Pieter Goosen
26 nov 2014 05:55:02
Mostra i restanti 1 commenti
0
-3

puoi utilizzare questo metodo:

    <?php
$category_id = get_cat_ID('Nome Categoria');
 <!-- Inizia il Loop. -->
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

 <!-- Verifica se il post corrente è nella categoria "Nome Categoria". -->
 <!-- Se lo è, al div viene assegnata la classe CSS "post-cat-special". -->
 <!-- Altrimenti, al div viene assegnata la classe CSS "post". -->

 <?php if ( in_category($category_id) ) { ?>
           <div class="post-cat-special">
 <?php } else { ?>
           <div class="post">
 <?php } ?>
</div>
 <!-- Termina il Loop (ma nota l'"else:" - vedi riga successiva). -->

 <?php endwhile; else: ?>


 <!-- Il primo "if" verifica se ci sono post da -->
 <!-- visualizzare. Questa parte "else" specifica cosa fare se non ce ne sono. -->
 <p>Spiacenti, nessun post corrisponde ai tuoi criteri.</p>


 <!-- TERMINA definitivamente il Loop. -->
 <?php endif; ?>

usa questo codice magico ovunque tu abbia bisogno di visualizzare...

25 nov 2014 16:40:31