Cómo obtener imágenes adjuntas de la Galería de una página/publicación en el orden establecido en el backend usando WP_Query()
Estoy intentando obtener todas las imágenes de la Galería
de una página en el orden en que están configuradas en el backend.
Hasta ahora tengo:
$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 );
Pero esto parece devolver todas las imágenes adjuntas en el orden estándar/predeterminado en lugar del orden en que he arrastrado y soltado las imágenes en la interfaz de edición de galería del backend.
Creo que esto podría deberse a que estoy consultando todas las imágenes adjuntas de mi página en lugar de específicamente la Galería, y como tal la información de ordenación para la galería no se pasa en el array devuelto.
¿Alguien puede decirme cómo obtener todas las imágenes de galería de un cierto page_id en el orden en que están configuradas en el backend? Solo habrá una galería por página si eso ayuda.
gracias
Cuando creas una galería a través del administrador de medios de WordPress 3.5, menu_order
ya no se utiliza para guardar el orden de las imágenes, el orden solo existe en el shortcode que insertas al hacer clic en el botón Insertar galería
, a través del atributo ids=
. Esto es para adaptarse al hecho de que ahora puedes agregar múltiples galerías a una sola entrada; ordenar mediante menu_order
no funcionaría en este caso. Para extraer estos IDs, tendremos que usar un poco de expresiones regulares para buscar en el contenido de la entrada los shortcodes de gallery
, luego usar esos IDs en una consulta post__in
, que ahora puede ordenarse convenientemente por esos IDs mediante el valor orderby
post__in
, introducido en la versión 3.5.
Si fuera mejor con las expresiones regulares, esto probablemente no sería tan complicado, pero por desgracia, soy terrible con ellas, así que usaremos algunas funciones nativas de WP y haremos algunas acrobacias para extraer estos atributos de ID. Esto funcionará para una o múltiples galerías en el contenido de la entrada. Acabo de probar esto colocándolo en el loop de una entrada, querrás cambiar $post->post_content
por lo que sea o donde sea que estés obteniendo el contenido de la entrada/página.
$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() ):
// recorrer las imágenes devueltas
endif;
wp_reset_query();
endif;
endforeach;
endif;

Tienes razón.
El menu_order ya no se utiliza para los medios en la galería. Desafortunadamente, parece que la única "fuente" del orden de la galería es el argumento "ids" del shortcode de la galería que está incrustado en el contenido de la página/entrada.
No estoy seguro si esto es por diseño o un descuido, pero podría ser intencional ya que ahora puedes incluir medios en una galería incluso si no están "adjuntos" a la página/entrada. En cualquier caso, a continuación está el método que uso para obtener los ids y conseguir los adjuntos basados en el orden especificado en el shortcode.
La clave es que el parámetro "orderby" en la llamada a get_posts debe ser "post__in", esto le indica que ordene según el orden de ID de publicación especificado en el parámetro "include". Mira a continuación.
// función auxiliar para devolver la primera coincidencia de regex
function get_match( $regex, $content ) {
preg_match($regex, $content, $matches);
return $matches[1];
}
// Extraer los argumentos del shortcode del $page o $post
$shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content));
// obtener los ids especificados en la llamada al shortcode
$ids = $shortcode_args["ids"];
// obtener los adjuntos especificados en el argumento "ids" del shortcode
$attachments = get_posts(
array(
'include' => $ids,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'menu_order ID',
'orderby' => 'post__in', //requerido para ordenar resultados según el orden especificado en el parámetro "include"
)
);
Esto no es ideal y sería bueno si el núcleo de WP almacenara este orden en la base de datos en algún lugar, pero funciona hasta que tengamos una mejor manera.
¡Espero que ayude!

Si todavía estás buscando una forma más sencilla de hacer esto, puedes usar el plugin attachments,
http://wordpress.org/plugins/attachments/
Mantiene la galería separada y no inserta los shortcodes de la galería de imágenes en el contenido del post, lo que te da control total sobre la visualización de las imágenes en tus posts/páginas/custom posts. También puedes cambiar el orden de tus imágenes simplemente arrastrando y soltando.
Aquí tienes un código de ejemplo de cómo recuperar las imágenes de tu galería,
<?php $attachments = new Attachments( 'attachments' ); /* pasa el nombre de la instancia */ ?>
<?php if( $attachments->exist() ) : ?>
<h3>Adjuntos</h3>
<p>Total Adjuntos: <?php echo $attachments->total(); ?></p>
<ul>
<?php while( $attachments->get() ) : ?>
<li>
ID: <?php echo $attachments->id(); ?><br />
Tipo: <?php echo $attachments->type(); ?><br />
Subtipo: <?php echo $attachments->subtype(); ?><br />
URL: <?php echo $attachments->url(); ?><br />
Imagen: <?php echo $attachments->image( 'thumbnail' ); ?><br />
Fuente: <?php echo $attachments->src( 'full' ); ?><br />
Tamaño: <?php echo $attachments->filesize(); ?><br />
Campo Título: <?php echo $attachments->field( 'title' ); ?><br />
Campo Leyenda: <?php echo $attachments->field( 'caption' ); ?>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
