Interogare articole doar cu imagini reprezentative

3 mar. 2013, 20:52:27
Vizualizări: 33.7K
Voturi: 17

Vreau să interoghez 6 articole, dar doar cele care au atașată o imagine reprezentativă. Folosesc metoda meta_key cu WP_Query astfel:

$args = array(
    'post_type'  => 'post',
    'meta_key' => '_thumbnail_id',
    'post_count' => 6 );
$query = new WP_Query($args);

Urmat de

<?php while($query->have_posts()) : $query->the_post(); ?>
    <h2><?php the_title(); ?></h2>
    <?php the_post_thumbnail('thumbnail'); ?>
<?php endwhile; ?>

Acest lucru nu pare să funcționeze. Interogarea returnează mai mult de 6 articole și, de asemenea, pe cele care nu au o imagine reprezentativă. Aveți idee ce am greșit?

@chip: var_dump($query); oferă un rezultat mare așa că l-am postat într-un pastebin

5
Comentarii

Fragmentul de cod a funcționat pentru mine conform așteptărilor. Poate că eroarea se află într-o altă parte a codului.

Ralf912 Ralf912
3 mar. 2013 21:40:51

Ce obții din var_dump( $query )?

Chip Bennett Chip Bennett
3 mar. 2013 22:07:45

Ca o idee suplimentară la care m-am gândit - postările au fost importate pe serverul meu local de pe un site live folosind exportatorul/importatorul WordPress. Postările originale aveau toate imagini reprezentative care au fost evident pierdute în procesul de import. Ar putea însemna că, deși imaginile reprezentative au fost eliminate, metacheile au rămas, provocând eroare în interogare?

harryg harryg
4 mar. 2013 01:39:38

Când ai rulat importul, ai bifat caseta pentru a descărca și atașa toate fișierele/media? Dacă nu ai făcut acest lucru, atunci imaginile evidențiate nu vor funcționa. Postările vor avea o imagine evidențiată, dar aceasta va face referire la un fișier atașat care nu există și, prin urmare, nu va fi afișată niciodată.

Tom J Nowell Tom J Nowell
4 mar. 2013 02:27:53

Da, am bifat caseta în timpul importului.

harryg harryg
4 mar. 2013 11:16:17
Toate răspunsurile la întrebare 2
5
31

Începând cu WordPress 3.5, Parametrii Interogării Meta acceptă operatorii de comparare EXISTS și NOT EXISTS. În cazul în care utilizați acești operatori, puteți omite partea value din interogarea meta. Încercați următorii parametri pentru interogarea dumneavoastră:

$args = array(
   'post_type'  => 'post',
   'posts_per_page' => 6,
    'meta_query' => array(
        array(
         'key' => '_thumbnail_id',
         'compare' => 'EXISTS'
        ),
    )
);
3 mar. 2013 21:59:12
Comentarii

Mulțumesc pentru sugestie. Acum primesc cele 6 postări, dar încă primesc postări fără imagini miniatură.

harryg harryg
4 mar. 2013 01:36:28

Am testat acest lucru și a funcționat pentru mine. Dar am observat că va returna entitățile care au meta setat, dar din anumite motive ID-ul atașamentului nu este corect. Așa că verifică dacă postările tale au setate imaginile reprezentative. În caz contrar, nu știu care ar putea fi problema.

helgatheviking helgatheviking
4 mar. 2013 02:01:26

harryg, poți confirma că folosești versiunea 3.5 sau mai recentă?

Tom J Nowell Tom J Nowell
4 mar. 2013 02:25:50

Da, rulez cea mai recentă versiune de WordPress - instalată proaspăt pe serverul meu local de dezvoltare într-o configurație de rețea (multisite).

harryg harryg
4 mar. 2013 11:15:22

Doar câteva informații suplimentare: Există un bug nerezolvat, vezi ticketul trac 23268, care face necesară utilizarea unei valori dacă este folosit NOT EXISTS.

Nicolai Grossherr Nicolai Grossherr
1 mar. 2014 00:28:17
8

Când rulezi importatorul, trebuie să bifezi caseta pentru a descărca și importa toate fișierele media/atașamente, iar serverul original trebuie să fie accesibil de pe serverul care efectuează importul.

Dacă nu faci acest lucru, articolele nu vor avea o imagine reprezentativă validă și nu vor fi afișate în bucla ta. Orice încercare de a folosi the_post_thumbnail va eșua, dând impresia că nu au nicio imagine reprezentativă.

Pentru a remedia această problemă, șterge articolele și reimportă-le folosind setările corecte, asigurându-te că vechiul server este încă accesibil la URL-ul original.

De asemenea, pentru a demonstra punctul, nu ai verificat niciodată articolele. Întotdeauna verifică, de exemplu:

if ( $query->have_posts() ) { // nu ai verificat niciodată dacă nu s-au găsit articole  
    while($query->have_posts()) { // sintaxa alternativă nu funcționează cu majoritatea IDE-urilor  
        // fiecare instrucțiune ar trebui să fie pe o linie separată  
        $query->the_post();  

        // ai nevoie doar de taguri de deschidere/închidere aici, nu pe fiecare linie, economisește timp  
        ?><h2><?php the_title(); ?></h2><?php   

        // afișează imaginea reprezentativă doar dacă există cu adevărat  
        if ( has_post_thumbnail() ) {  
            echo '<p>articolul afirmă că are o imagine reprezentativă</p>'; // verificare dublă  
            the_post_thumbnail('thumbnail');  
        } else {  
            echo '<p>acest articol nu are o imagine reprezentativă</p>';  
        }  
    }  
} else {  
    echo '<p>nu s-au găsit articole</p>';  
}  

Dacă nu ai bifat caseta, vei primi mesaje că articolele au imagini reprezentative, dar nicio imagine nu va fi afișată.

4 mar. 2013 02:29:59
Comentarii

Bănuiesc că acesta este motivul pentru care răspunsul pe care l-am oferit nu funcționează conform așteptărilor. Plugin-ul WordPress Suicide este destul de util pentru ștergerea tuturor conținuturilor.

helgatheviking helgatheviking
4 mar. 2013 06:48:01

Cu siguranță am bifat acea casetă. Totuși, în experiența mea, nu a funcționat niciodată pentru mine. Toate imaginile erau legate înapoi către site-ul extern. Am folosit plugin-ul Import External Images(http://wordpress.org/extend/plugins/import-external-images/) pentru a stoca imaginile local și a le atașa.

harryg harryg
4 mar. 2013 11:14:14

M-am gândit la același lucru, am bifat cu siguranță caseta, de ce tot nu funcționează? Am întâlnit această problemă de la clienți și este atât de ușor să greșești, așa că ștergeți postările, reimportați și asigurați-vă că este bifată, iar dacă tot nu funcționează, atunci o puteți exclude. Altfel, există un discurs al lui Neil DeGrasse Tyson despre cât de patetic de slabă este memoria umană. Chiar acum aș putea să vă cer să debifați a doua casetă și probabil v-ați aminti că ați văzut-o și pe aceea (dar nu există una).

Tom J Nowell Tom J Nowell
4 mar. 2013 11:52:50

și între timp, înfășoară the_post_thumbnail cu un apel has_thumbnail și adaugă un caz else, astfel încât să știi clar și fără ambiguitate că articolul nu are o imagine reprezentativă

Tom J Nowell Tom J Nowell
4 mar. 2013 11:53:56

De asemenea, asigură-te că serverul tău poate accesa serverul la distanță. Dacă serverul tău nu poate face cereri la distanță, nu va putea importa. S-ar putea să fie nevoie să ștergi fișierele media deja preluate

Tom J Nowell Tom J Nowell
4 mar. 2013 12:00:50

@Tom mulțumesc pentru comentarii. Știu că spui că e ușor să uiți să faci ceva, dar SIGUR am bifat caseta. Problema este că de foarte multe ori nu a funcționat pentru mine; bifez caseta, dar niciuna dintre imagini nu se importă și rămân cu toate articolele având imagini legate extern. Serverul meu este o simplă configurație Xampp care rulează pe MacOS și care are acces la distanță. Cred că e o combinație între eșecul casetei de bifat și pluginul pe care l-am folosit pentru a prelua toate imaginile, care nu a reușit să le "featureze" corect. Voi încerca sugestiile tale diseară și voi reveni cu feedback

harryg harryg
4 mar. 2013 12:46:09

XAMPP este doar un instrument pentru Windows? În loc să dezbatem ce crezi că știi și despre sentimentele tale, demonstrează prin codul de depanare și postează date utile, clare, lipsite de ambiguitate. Literele mari nu te vor ajuta. Am reușit să reproduc această problemă de multe ori atât local, cât și pe serverele clienților, bifând sau debifând caseta, și am făcut și eu greșeala, iar în prezent aceasta este cea mai precisă teorie având în vedere informațiile furnizate. Dacă nu ești de acord, atunci furnizează informații noi pentru a putea ajunge la o teorie mai bună.

Tom J Nowell Tom J Nowell
4 mar. 2013 13:08:49

Nu, Xampp funcționează bine și pe Mac! Din păcate nu există dovezi concrete că am bifat sau nu caseta, dar asta e cam irelevant. Problema apare pentru că importul media a eșuat - postarea crede că are o imagine reprezentativă deoarece meta tag-ul este prezent, dar nu există nicio imagine reală. Adăugarea unei noi imagini reprezentative și eliminarea ei împiedică postarea să apară, arătând că interogarea funcționează, ceea ce voiam să aflu. Mulțumesc pentru sugestii.

harryg harryg
4 mar. 2013 23:35:17
Arată celelalte 3 comentarii