Obține articole din categoriile copil folosind ID-ul categoriei părinte

25 nov. 2014, 14:26:07
Vizualizări: 20.9K
Voturi: 3

Am un plugin care afișează articole dintr-o categorie aleasă. Când sunt alese categoriile copil, funcționează perfect. Totuși, când aleg o categorie părinte, nu afișează niciun articol din categoriile copil.

Sper că acesta este fragmentul de cod care trebuie modificat, dar nu sunt sigur.

Ar fi frumos dacă cineva m-ar putea ajuta.

<ul>

<?php 
   query_posts(array(
      'post_type' => 'post', 
      'category__in' => $text, 
      'orderby' => 'meta_value_num', 
      'meta_key' => 'rankk', 
      'order' => 'DESC', 
      'posts_per_page' => 100
   )); 
?>
5
Comentarii

Pluginurile prost scrise duc întotdeauna la dezastru mai devreme sau mai târziu. În opinia mea, șterge acel plugin și scrie propriul cod sau găsește un plugin scris corect. Nu are rost să schimbi anvelopa avariată când întreaga mașină e de casat :-)

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

Aș vrea să fiu capabil să fac asta ;-)

nanonano nanonano
25 nov. 2014 14:35:30

Sincer să fiu, modificarea codului într-un plugin e o practică proastă. Când vorbești despre selectarea categoriei părinte, ai nevoie de articole din categoria părinte și de articole din categoriile sale copil?

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

exact! Părinții sunt goi oricum.´

nanonano nanonano
25 nov. 2014 15:00:45

Din câte știu, 'category__in' nu afișează copiii din categoriile părinte. Dar nici nu știu ce altceva să folosesc.

nanonano nanonano
25 nov. 2014 16:15:33
Toate răspunsurile la întrebare 2
6
11

După cum am menționat în comentariile la întrebarea ta

Pluginurile scrise prost duc întotdeauna la dezastre la un moment dat. În opinia mea, șterge acel plugin și scrie propriul cod sau găsește un plugin scris corect. Nu are rost să schimbi pneul deteriorat când întreaga mașină este complet irecuperabilă :-)

Pentru a începe, niciodată nu folosi query_posts

Notă: Această funcție nu este destinată să fie utilizată de pluginuri sau teme. După cum se explică mai târziu, există opțiuni mai bune și mai performante pentru a modifica interogarea principală. query_posts() este o modalitate prea simplistă și problematică de a modifica interogarea principală a unei pagini prin înlocuirea ei cu o nouă instanță a interogării. Este ineficientă (re-execută interogările SQL) și va eșua în mod clar în unele circumstanțe (în special atunci când ai de-a face cu paginarea postărilor).

Chiar e mai bine să scrii propriul cod și să renunți la plugin. Poți de asemenea să combini pluginul curent (doar codul "bun") cu codul pe care ți-l voi oferi într-un propriul plugin dacă este necesar.

Nu ar trebui niciodată să faci modificări în fișierele de plugin/temă ale căror autor nu ești tu. Cel mai mare motiv este că, în ziua actualizării, vei pierde toate personalizările tale. Mai degrabă creează propriul plugin sau fă modificările într-un child theme.

Ceea ce încerci să realizezi nu este posibil cu parametrii actuali ai categoriei. Cea mai bună soluție ar fi să folosești un tax_query cu WP_Query. Cu un tax_query, implicit, termenii copii sunt incluși în termenul setat, iar asta este ceea ce cauți.

Poți încerca următoarele (ATENȚIE: necesită 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'    => 'ID-UL TĂU DE CATEGORIE PĂRINTE',
            ],
        ],
];

$q = new WP_Query( $args );

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

Pentru versiunile PHP anterioare 5.4, încearcă asta

$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'    => 'ID-UL TĂU DE CATEGORIE PĂRINTE',
            ),
        ),
);

$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
Comentarii

Am încercat să folosesc sugestia ta. Dar nu am cunoștințe de PHP :/. Aș putea să te plătesc să o repari? (mi-ar plăcea să existe o opțiune de mesaj privat)

nanonano nanonano
25 nov. 2014 17:26:34

Scuze, există o mică eroare de sintaxă în codul meu. Vezi actualizarea mea

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

Am primit o eroare fatală (am Backup-uri pentru orice eventualitate). Ar trebui să înlocuiesc 'YOUR PARENT CATEGORY ID' cu $text?

nanonano nanonano
25 nov. 2014 17:46:14

Ei bine, dacă rămâi cu plugin-ul și îl modifici (ceea ce nu recomand cu adevărat), atunci da

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

Am reușit să-l fac să funcționeze! Am editat codul tău.

nanonano nanonano
26 nov. 2014 01:28:50

Mulțumesc pentru sugestia de editare. Acum înțeleg unde era problema ta și ar fi trebuit să adaug o notă la acest lucru, sintaxa din codul meu este acceptată doar de versiunile PHP 5.4 și mai noi. La versiunile anterioare vei primi o eroare fatală. În versiunile anterioare ar trebui să folosești array(), în timp ce în 5.4+ poți folosi pur și simplu [] :-)

Pieter Goosen Pieter Goosen
26 nov. 2014 05:55:02
Arată celelalte 1 comentarii
0
-3

poți folosi acest mod:

    <?php
$category_id = get_cat_ID('Numele Categoriei');
 <!-- Începe bucla. -->
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

 <!-- Verifică dacă postarea curentă este în categoria "Numele Categoriei". -->
 <!-- Dacă este, div-ului i se atribuie clasa CSS "post-cat-special". -->
 <!-- În caz contrar, div-ului i se atribuie clasa CSS "post". -->

 <?php if ( in_category($category_id) ) { ?>
           <div class="post-cat-special">
 <?php } else { ?>
           <div class="post">
 <?php } ?>
</div>
 <!-- Oprește bucla (dar observă "else:" - vezi linia următoare). -->

 <?php endwhile; else: ?>


 <!-- Primul "if" a verificat dacă există postări de afișat. -->
 <!-- Această parte "else" specifică ce să se afișeze dacă nu există postări. -->
 <p>Ne pare rău, nicio postare nu corespunde criteriilor tale.</p>


 <!-- OPREȘTE COMPLET bucla. -->
 <?php endif; ?>

folosește acest cod magic oriunde ai nevoie să afișezi....

25 nov. 2014 16:40:31