Come ottenere le immagini della galleria di una pagina/articolo nell'ordine impostato nel backend usando WP_Query()?
Sto cercando di recuperare tutte le immagini dalla Galleria
di una pagina nell'ordine in cui sono state impostate nel backend.
Finora ho:
$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 );
Ma questo sembra restituire tutte le immagini degli allegati nell'ordine standard/predefinito piuttosto che nell'ordine in cui ho trascinato e rilasciato le immagini nell'interfaccia di modifica della galleria nel backend.
Credo che questo possa essere dovuto al fatto che sto interrogando tutte le immagini allegate della mia pagina piuttosto che specificamente la Galleria, e quindi le informazioni di ordinamento per la galleria non vengono passate nell'array restituito.
Qualcuno può dirmi come ottenere tutte le immagini della galleria di un certo page_id nell'ordine in cui sono impostate nel backend? Ci sarà solo una galleria per pagina, se questo può aiutare.
grazie

Quando crei una galleria tramite il media manager di WordPress 3.5, il campo menu_order
non viene più utilizzato per salvare l'ordine delle immagini. L'ordine esiste solo nello shortcode che inserisci quando clicchi il pulsante Inserisci Galleria
, attraverso l'attributo ids=
. Questo per adattarsi al fatto che ora puoi aggiungere più gallerie a un singolo post - ordinare tramite menu_order
non funzionerebbe in questo caso. Per estrarre questi ID, dovremo usare un po' di espressioni regolari per cercare i contenuti del post alla ricerca degli shortcode gallery
, quindi usare quegli ID in una query post__in
, che ora può essere comodamente ordinata per quegli ID tramite il valore orderby
post__in
, introdotto nella versione 3.5.
Se fossi più bravo con le regex, probabilmente non sarebbe così complicato, ma purtroppo non sono bravo, quindi useremo alcune funzioni native di WP e faremo qualche salto mortale per estrarre questi attributi ID. Questo funzionerà per una o più gallerie nel contenuto del post. Ho appena testato questo codice inserendolo nel loop di un post, dovrai cambiare $post->post_content
con qualunque sia la sorgente da cui stai ottenendo il contenuto del post/pagina.
$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() ):
// loop sulle immagini restituite
endif;
wp_reset_query();
endif;
endforeach;
endif;

Hai ragione.
Il menu_order non viene più utilizzato per i media nella galleria. Sfortunatamente, sembra che l'unica "fonte" dell'ordine della galleria sia l'argomento "ids" dello shortcode della galleria che è incorporato nel contenuto della pagina/post.
Non sono sicuro se sia una scelta intenzionale o una svista, ma potrebbe essere intenzionale dato che ora puoi includere media in una galleria anche se non sono "allegati" alla pagina/post. In ogni caso, di seguito è riportato il metodo che utilizzo per ottenere gli ID e recuperare gli allegati in base all'ordine specificato nello shortcode.
Il punto chiave è che il parametro "orderby" nella chiamata a get_posts deve essere "post__in": questo gli dice di ordinare in base all'ordine degli ID post specificato nel parametro "include". Vedi sotto.
// funzione helper per restituire la prima corrispondenza regex
function get_match( $regex, $content ) {
preg_match($regex, $content, $matches);
return $matches[1];
}
// Estrai gli argomenti dello shortcode dalla $page o $post
$shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content));
// ottieni gli ID specificati nella chiamata dello shortcode
$ids = $shortcode_args["ids"];
// ottieni gli allegati specificati nell'argomento "ids" dello shortcode
$attachments = get_posts(
array(
'include' => $ids,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'menu_order ID',
'orderby' => 'post__in', // necessario per ordinare i risultati in base all'ordine specificato nel parametro "include"
)
);
Non è l'ideale e sarebbe bello se il core di WP memorizzasse questo ordinamento da qualche parte nel database, ma funziona finché non avremo un modo migliore.
Spero sia utile!

Se stai ancora cercando un modo più semplice per farlo, puoi utilizzare il plugin Attachments,
http://wordpress.org/plugins/attachments/
Mantiene la galleria separata e non inserisce gli shortcode della galleria immagini nel contenuto del post, dandoti così il pieno controllo sulla visualizzazione delle immagini nel tuo post/pagina/custom post. Puoi anche cambiare l'ordine delle immagini semplicemente trascinandole.
Ecco un esempio di codice per recuperare le immagini della tua galleria,
<?php $attachments = new Attachments( 'attachments' ); /* passa il nome dell'istanza */ ?>
<?php if( $attachments->exist() ) : ?>
<h3>Allegati</h3>
<p>Totale Allegati: <?php echo $attachments->total(); ?></p>
<ul>
<?php while( $attachments->get() ) : ?>
<li>
ID: <?php echo $attachments->id(); ?><br />
Tipo: <?php echo $attachments->type(); ?><br />
Sottotipo: <?php echo $attachments->subtype(); ?><br />
URL: <?php echo $attachments->url(); ?><br />
Immagine: <?php echo $attachments->image( 'thumbnail' ); ?><br />
Sorgente: <?php echo $attachments->src( 'full' ); ?><br />
Dimensione: <?php echo $attachments->filesize(); ?><br />
Campo Titolo: <?php echo $attachments->field( 'title' ); ?><br />
Campo Didascalia: <?php echo $attachments->field( 'caption' ); ?>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
