Suport » Probleme și soluții » Probleme cu paginaţia dacă numărul de postări din „The Loop” este variabil

  • Rezolvat smashmatic

    (@smashmatic)


    Salut!

    Am un site web pe care folosesc aşa-numitul „The Loop” (ciclu) pentru a afişa conţinutul de pe prima pagină.

    Treaba stă cam aşa.

    Am în stânga o postare (cea mai recentă postare), apoi în dreapta am o listă cu următoarele 5 postări. Acum unele postări de pe site au un câmp personalizat de articole similare (în care se află ID-ul articolului similar). Dacă Loop-ul dă peste o astfel de postare, postarea similară (înrudită) este afişată şi ea pe prima pagină chiar sub cea de care aparţine. Deci să zicem că am 6 articole aşa, iar articolul 3 are o postare înrudită. Am atunci aşa:

    În stânga: articolul 1.
    În dreapta: articolul 2, articolul 3, articolul inrudit cu 3, articolul 4, articolul 5, articolul 6.

    7 articole în total.

    Pentru că folosesc „Loop-ul” cu contor trebuie să setez numărul de postări pe pagină din setările blogului (din „Citire”). Dacă aleg 7 atunci prima pagină arată perfect. A doua pagină, are forma:

    În stânga: articolul 7.
    În dreapta: articolul 8, articolul 9, articolul 10, articolul 11, articolul 12.

    6 articole în total. Acum, din cauză că am setat numărul la 7 mai înainte, dacă dau pe a treia pagină, paginaţia sare peste un articol: pagina trei începe direct cu articolul 14 şi nu 13 cât ar trebui.

    Este vreo modalitate de a face limita de articole pe pagină variabilă în funcţie de numărul exact de articole afişate de „The Loop”?

Vizualizare 3 răspunsuri - 1 la 3 (din 3 în total)
  • Ai putea seta variabile în funcție de id-ul paginii/slug-ul paginii.

    Verifici dacă pagina are slug-ul X atunci max_posts=x… și tot așa.
    Sper că am înțeles întrebarea.

    Cred că ar fi fost prea mult de lucrat totuși am găsit o soluție. Mai băbească, dar e ok.

    De fapt care era problema? În practică aveam vroiam ca fiecare pagină dinamică de pe site (adică care nu e articol) să aibă 5 articole, dar numărătoarea să nu includă eventualele articole înrudite, care sunt eventual doar o anexă la unul din cele cinci articole principale. Problema apărea din cauza dublurilor. Foloseam <?php if (in_array(post->ID,$do_not_duplicate)) continue ?>, după cum
    scrie la carte, numai că deși dublura dispărea, contorul nu era resetat. Și mă trezeam cu patru postări sau chiar trei pe paginile cu unu și respectiv două articole înrudite. Dacă blocam Ciclul (The Loop) la 5 cu ajutorul unui contor (adică cât contorul e mai mic decât 6 ciclul se desfășoară, când ajunge la șase ss oprește) stricam paginația (ce am scris mai sus).

    În final am renunțat să folosesc comanda continue. În schimb am
    mai creat un ciclu care se comportă exact la fel ca primul, doar că rolul lui e doar să-mi umple un șir cu dublurile (este vorba de $do_not_duplicate[]). Ăsta l-am pus chiar la începutul paginii index.

    Apoi, ciclului principal i-am declarat argumentul 'post__not_in'=>$do_not_duplicate;.

    O să încerc mâine să pun codul simplificat aici, în caz că vor fi și alții care să aibă aceeași problemă cu mine.

    Uite codul cu care am rezolvat. Poate e de folos cuiva.

    <!-- INCEPUT INREGISTRARE DUBLURI -->
    <?php 
    
    $args = array(
    	'showposts'=> -1,
    	'order' => 'date'
    	);
    
    $do_not_duplicate=array();
    $myquery = new WP_Query($args);
      while ($myquery->have_posts()) : $myquery->the_post(); ?>
    
    <!--inceput stire-similara -->
    <?php $stirisimilare = get_post_meta($post->ID, "stirilatema", false); $args = array(
    	'post__in' => $stirisimilare,
    	'showposts'=> -1,
    	'order' => 'date'
    	);?>
       <?php if ($stirisimilare): ?>
       <?php $similare = new WP_Query($args);
      while ($similare->have_posts()) : $similare->the_post();
      $do_not_duplicate[] = get_the_ID(); ?>
        <?php endwhile; ?>
        <?php endif; ?>
    <!--sfarsit stire-similara -->
    <?php endwhile; ?>
    <!-- SFARSIT INREGISTRARE DUBLURI -->
    
    <?php wp_reset_query(); ?>
    
    <?php
    $args=array('post__not_in'=>$do_not_duplicate,
                'paged'=>$paged);
    $myquery = new WP_Query($args);
     if ($myquery->have_posts()) : ?>
    
    <?php while ($myquery->have_posts()) : $myquery->the_post();
     update_post_caches($posts); ?>
    
    // AICI VINE CODUL PENTRU ARTICOLELE OBISNUITE
    
    <!--inceput stire-similara -->
    
    <?php $stirisimilare = get_post_meta($post->ID, "stirilatema", false); $args = array(
    	'post__in' => $stirisimilare,
    	'showposts'=> -1,
    	'order' => 'date'
    	);?>
               <?php if ($stirisimilare): ?>
               <?php $similare = new WP_Query($args);
      while ($similare->have_posts()) : $similare->the_post();
      $do_not_duplicate[] = get_the_ID(); ?>
    
    // AICI VINE CODUL PENTRU STIRILE SIMILARE LA UN ARTICOL OBISNUIT
    
                                          <?php endwhile; ?>
                                          <?php endif; ?>
    <!-- inchidere stire-similara -->                               
    
    <?php endwhile; ?>
    <!-- inceput paginatie -->
    <?php posts_nav_link(); ?>
    <!-- inchidere paginatie --></div>
    
    <?php endif; ?>
Vizualizare 3 răspunsuri - 1 la 3 (din 3 în total)
  • Subiectul ‘Probleme cu paginaţia dacă numărul de postări din „The Loop” este variabil’ este închis pentru noi răspunsuri.