Como obter as imagens de anexo da Página / Galeria de Mensagens para que elas estejam definidas no backend usando WP_Query ()?

Estou tentando recuperar todas as imagens da Gallery de uma página na ordem em que estão configuradas no backend.

Até agora eu tenho:

  $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 ); 

Mas isso parece retornar todas as imagens de anexos na ordem padrão / padrão, em vez da ordem em que arrastou e soltei as imagens na interface do backend edit interface.

Eu acredito que isso pode ser devido ao fato de eu estar consultando todas as imagens de anexo da minha página em vez de especificamente a Galeria e, como tal, as informações de sorting para a galeria não são passadas na matriz retornada.

Alguém pode me dizer como obto todas as imagens da galeria de um determinado page_id na ordem em que estão configuradas no backend? Só haverá uma galeria por página se isso ajudar.

obrigado

Solutions Collecting From Web of "Como obter as imagens de anexo da Página / Galeria de Mensagens para que elas estejam definidas no backend usando WP_Query ()?"

Quando você cria uma galeria através do gerenciador de mídia 3.5, menu_order não é mais usado para salvar a ordem das imagens, a ordem só existe no código curto que você insere quando você clica no botão Insert Gallery , através do atributo ids= . Isto é para acomodar o fato de que agora você pode adicionar várias galerias a um único post-pedido via menu_order não funcionaria para este caso. Para extrair essas IDs, teremos que usar um pouco de regex para pesquisar conteúdo de publicação para shortcodes de gallery , em seguida, usar esses IDs em uma consulta post__in , que agora pode ser convenientemente ordenada por esses IDs através do valor orderby new-in-3.5 post__in .

Se eu fosse melhor na regex, isso provavelmente não seria tão complicado, mas, infelizmente, eu sou terrível, então usaremos algumas funções WP nativas e faremos algumas backflips para extrair esses atributos de identificação. Isso funcionará para uma ou várias galerias no conteúdo do post. Eu apenas testei isso deixando cair no loop de uma postagem, você vai querer mudar $post->post_content para o que quer que você esteja recebendo o conteúdo da publicação / 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() ): // loop over returned images endif; wp_reset_query(); endif; endforeach; endif; 

Você está certo.

O menu_order não é mais usado para mídia na galeria. Infelizmente, parece que a única “fonte” da ordem da galeria é o argumento “ids” para o shortcode da galeria que está incorporado no conteúdo da página / publicação.

Não tenho certeza se isso é por design ou supervisão, mas pode ser por design, já que agora você pode include mídia em uma galeria, mesmo que não esteja “anexado” à página / publicação. Em qualquer caso, abaixo é o método que uso para pegar os IDs e obter os anexos com base na ordem especificada no shortcode.

A chave é que o parâmetro “orderby” na chamada para get_posts deve ser “post__in”, isso diz para pedir pela ordem de publicação indicada no parâmetro “include”. Ver abaixo.

 // helper function to return first regex match function get_match( $regex, $content ) { preg_match($regex, $content, $matches); return $matches[1]; } // Extract the shortcode arguments from the $page or $post $shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content)); // get the ids specified in the shortcode call $ids = $shortcode_args["ids"]; // get the attachments specified in the "ids" shortcode argument $attachments = get_posts( array( 'include' => $ids, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'menu_order ID', 'orderby' => 'post__in', //required to order results based on order specified the "include" param ) ); 

Isso não é ideal e seria bom se o WP core armazenasse esse pedido no database em algum lugar, mas funciona até que tenhamos uma maneira mais agradável.

Espero que ajude!

 $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' ) ); 

Este trecho sempre funcionou para mim.

Se você ainda está procurando uma maneira mais simples de fazer isso, você pode usar o plugin de anexos,

http://wordpress.org/plugins/attachments/

Ele mantém a galeria separada e não coloca a galeria de imagens em shortcodes no conteúdo do post, proporcionando-lhe uma exibição total da imagem na postagem / página / postagem personalizada. Você também pode alterar a ordem de suas imagens simplesmente arrastando-e-soltar

aqui está um exemplo de código de como recuperar suas imagens da galeria,

 < ?php $attachments = new Attachments( 'attachments' ); /* pass the instance name */ ?> < ?php if( $attachments->exist() ) : ?> 

Attachments

Total Attachments: < ?php echo $attachments->total(); ?>

    < ?php while( $attachments->get() ) : ?>
  • ID: < ?php echo $attachments->id(); ?>
    Type: < ?php echo $attachments->type(); ?>
    Subtype: < ?php echo $attachments->subtype(); ?>
    URL: < ?php echo $attachments->url(); ?>
    Image: < ?php echo $attachments->image( 'thumbnail' ); ?>
    Source: < ?php echo $attachments->src( 'full' ); ?>
    Size: < ?php echo $attachments->filesize(); ?>
    Title Field: < ?php echo $attachments->field( 'title' ); ?>
    Caption Field: < ?php echo $attachments->field( 'caption' ); ?>
  • < ?php endwhile; ?>
< ?php endif; ?>