Cum să obții imaginile din Galeria unei pagini/articole în ordinea setată în backend folosind WP_Query()?
Încerc să obțin toate imaginile din Galeria
unei pagini în ordinea în care sunt setate în backend.
Până acum am:
$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(
array(
'post_type' => 'attachment',
'post_parent' => 54,
'post_mime_type' =>'image',
'post_status' => 'inherit',
'posts_per_page' => '20',
'orderby' => 'menu_order',
'order' => 'ASC'
)
);
var_dump($all_wp_pages);
Dar acest cod pare să returneze toate imaginile atașate în ordinea standard/implicită, nu în ordinea în care le-am aranjat prin drag and drop în interfața de editare a galeriei din backend.
Cred că această problemă apare pentru că interoghez toate imaginile atașate ale paginii mele, nu doar pe cele din Galerie, iar informația despre sortarea galeriei nu este inclusă în array-ul returnat.
Poate cineva să-mi spună cum pot obține toate imaginile galeriei pentru un anumit ID de pagină în ordinea setată în backend? Există doar o singură galerie pe pagină, dacă acest detaliu ajută.
Mulțumesc

Când creezi o galerie prin managerul media din WordPress 3.5, menu_order
nu mai este folosit pentru a salva ordinea imaginilor, ordinea există doar în shortcode-ul inserat când apeși butonul Insert Gallery
, prin atributul ids=
. Acest lucru permite adăugarea mai multor galerii într-un singur articol - ordonarea prin menu_order
nu ar funcționa în acest caz. Pentru a extrage aceste ID-uri, va trebui să folosim expresii regulate pentru a căuta în conținutul postării shortcode-urile de tip gallery
, apoi să folosim aceste ID-uri într-o interogare post__in
, care acum poate fi ordonată după aceste ID-uri folosind valoarea nou introdusă în 3.5 orderby
cu post__in
.
Dacă aș fi mai priceput la expresii regulate, probabil că nu ar fi atât de complicat, dar din păcate, nu mă descurc prea bine, așa că vom folosi câteva funcții native din WordPress și vom face câteva acrobații pentru a extrage aceste atribute ID. Acest lucru va funcționa pentru una sau mai multe galerii în conținutul postării. Tocmai am testat acest cod inserându-l în loop-ul unei postări, va trebui să înlocuiți $post->post_content
cu sursa din care obțineți conținutul postării/paginii.
$pattern = get_shortcode_regex();
if( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
&& array_key_exists( 2, $matches )
&& in_array( 'gallery', $matches[2] ) ):
$keys = array_keys( $matches[2], 'gallery' );
foreach( $keys as $key ):
$atts = shortcode_parse_atts( $matches[3][$key] );
if( array_key_exists( 'ids', $atts ) ):
$images = new WP_Query(
array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'post__in' => explode( ',', $atts['ids'] ),
'orderby' => 'post__in'
)
);
if( $images->have_posts() ):
// buclă pentru prelucrarea imaginilor returnate
endif;
wp_reset_query();
endif;
endforeach;
endif;

Aveți dreptate.
menu_order nu mai este folosit pentru media în galerie. Din păcate, se pare că singura "sursă" a ordinii galeriei este argumentul "ids" din shortcode-ul galeriei care este încorporat în conținutul paginii/postării.
Nu sunt sigur dacă aceasta este o decizie intenționată sau o omisiune, dar ar putea fi intenționat deoarece acum puteți include media într-o galerie chiar dacă nu este "atașat" la pagina/postare. În orice caz, mai jos este metoda pe care o folosesc pentru a extrage ID-urile și a obține atașamentele în ordinea specificată în shortcode.
Cheia este că parametrul "orderby" din apelul la get_posts trebuie să fie "post__in" - aceasta îi spune să ordoneze în funcție de ordinea ID-urilor specificate în parametrul "include". Vezi mai jos.
// funcție helper pentru a returna prima potrivire regex
function get_match( $regex, $content ) {
preg_match($regex, $content, $matches);
return $matches[1];
}
// Extrage argumentele shortcode-ului din $page sau $post
$shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content));
// obține ID-urile specificate în apelul shortcode
$ids = $shortcode_args["ids"];
// obține atașamentele specificate în argumentul "ids" al shortcode-ului
$attachments = get_posts(
array(
'include' => $ids,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'menu_order ID',
'orderby' => 'post__in', // necesar pentru a ordona rezultatele în funcție de ordinea specificată în parametrul "include"
)
);
Aceasta nu este soluția ideală și ar fi bine dacă nucleul WP ar stoca această ordonare undeva în baza de date, dar funcționează până vom avea o metodă mai bună.
Sper că vă ajută!

$oImages = get_posts(
array(
'numberposts' => -1,
'post_parent' => $post->ID,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'ASC',
'orderby' => 'menu_order'
)
);
Acest fragment de cod a funcționat întotdeauna pentru mine.

Dacă încă cauți o metodă mai simplă de a face acest lucru, poți folosi pluginul attachments,
http://wordpress.org/plugins/attachments/
Acesta păstrează galeria separată și nu introduce shortcode-urile galeriei în conținutul articolului, oferindu-ți astfel control total asupra afișării imaginilor în articol/pagină/post personalizat. De asemenea, poți schimba ordinea imaginilor prin simplul drag-n-drop
Iată un exemplu de cod pentru a prelua imaginile din galerie,
<?php $attachments = new Attachments( 'attachments' ); /* treci numele instanței */ ?>
<?php if( $attachments->exist() ) : ?>
<h3>Atașamente</h3>
<p>Total Atașamente: <?php echo $attachments->total(); ?></p>
<ul>
<?php while( $attachments->get() ) : ?>
<li>
ID: <?php echo $attachments->id(); ?><br />
Tip: <?php echo $attachments->type(); ?><br />
Subtip: <?php echo $attachments->subtype(); ?><br />
URL: <?php echo $attachments->url(); ?><br />
Imagine: <?php echo $attachments->image( 'thumbnail' ); ?><br />
Sursă: <?php echo $attachments->src( 'full' ); ?><br />
Dimensiune: <?php echo $attachments->filesize(); ?><br />
Câmp Titlu: <?php echo $attachments->field( 'title' ); ?><br />
Câmp Descriere: <?php echo $attachments->field( 'caption' ); ?>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
