Loop de Attachments Random
-
Olá pessoal.
Estou com dúvidas/problemas em como fazer um loop de attachments randomico.Explicando:
Cada post possui N imagens anexadas. Em uma página quero listar todas essas imagens mas de forma ramdomica. Com o rand como argumento ele mistura apenas os posts (e não os attachments).Queria pegar todas as imagens de todos os posts desse loop e então dar um rand.
Alguém tem alguma dica?
Valew.
-
Aí Everaldo, aprenda bem a usar a WP_Query, é a sua melhor amiga na construção de loops.
Para 10 anexos aleatórios, tente algo assim:
<?php $query = new WP_Query( array( 'post_type' => 'attachment', 'posts_per_page' => 10, 'orderby' => 'rand' ) ); ?> <?php if ( $query->have_posts() ) : ?> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <?php $img = wp_get_attachment_image_src( get_the_ID(), 'thumbnail', $size, $icon ); $link = wp_get_attachment_link( get_the_ID() ); ?> <a href="<?php echo $link; ?>" title="<?php the_title(); ?>"> <img src="<?php echo $img['url']; ?>" alt="<?php the_title(); ?>" /> </a> <?php endwhile; ?> <?php else : ?> <p>Nenhum anexo foi cadastrado.</p> <?php endif; ?>
Grande Vinícius. Obrigado a atenção. Meu código está assim:
<?php $custom_query = new WP_Query( array ( 'orderby' => 'rand', 'cat' => '-1' ) ); // exclude category 1 while($custom_query->have_posts()) : $custom_query->the_post(); ?> <?php $args = array( 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' => null, 'post_parent' => $post->ID, 'orderby' => 'rand', ); $attachments = get_posts($args); if ($attachments){ foreach ($attachments as $post) { echo '<div class="box">'; setup_postdata($post); $postURL = explode("attachment", get_permalink($post->ID)); $postImage = wp_get_attachment_image($post->ID, $size='thumbnail', $icon = false); ?> <a href="<?php echo wp_get_attachment_url( $post->ID ); ?>" rel="lightbox" ><?php echo $postImage; ?></a> </div> <?php } } ?> <?php endwhile; ?>
Nisso ele imprime o seguinte:
post->1
att->1,3,2;
post->3
att->1,2,3,5,4;
post->5
att->1,5,3,2,4;
post->4
att->4,2,3,1,4;
post->2
att->2,1,4,5,3;O que eu quero, é pegar todos os attachments de todos os posts e então apresentar randomico, independente do post que ele está.
Nesse código acima, ele está ramdonizando os posts e os attachments. Mas os attachments do post->1 não estão se misturando com os attachments dos outros posts.
Valew pessoal.
Esse loop abaixo, apresentado no codex da WP_Query como o Vinícius falou funciona e faz o rand perfeitamente.
<?php $args = array( 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' => 'any', 'post_parent' => null, 'orderby' => 'rand' ); $attachments = get_posts( $args ); if ($attachments) { foreach ( $attachments as $post ) { setup_postdata($post); the_attachment_link($post->ID, false); } } ?>
Porém ele imprime também os attachments que estão “desanexados”, que não pertencem a nenhum post. Como posso fazer para ele mostrar apenas os attachments que pertencem a algum post?
Pessoal, consegui.
Coloquei a seguinte verificação:
<?php if ( $post->post_parent > 0 ) { ?>
E então só exibe attachments atrelados a algum post, o que muda o valor de post_parent para algo maior que 0.
Se falei bobagem, por favor me corrijam.
Tenta isso daqui, Everaldo. O exemplo anterior não estava testado e não funciona. Você precisa trocar
thumbnail
pelo tamanho da imagem que quer mostrar.<?php global $wpdb; $sql = " SELECT ID FROM {$wpdb->posts} WHERE 1=1 AND post_type = 'attachment' AND post_parent != 0 AND post_mime_type LIKE 'image/%' "; foreach( $wpdb->get_results( $sql ) as $post ) { echo wp_get_attachment_link( $post->ID, 'thumbnail' ); } ?>
Funcionou também Vinícius. Muito obrigado.
O que eu postei alguns minutos antes de você funcionou perfeitamente. Mas está muito gambiarra com aquele if?No seu, só faltou um RAND(), mas funcionou também.
Obrigado mais uma vez.
Abraço.Oi Everaldo. Este meu último exemplo é mais eficiente. Sai direto da consulta para a iteração sem nenhuma lógica adicional.
Perfeito.
Muito obrigado pelo empenho.Abraços.
- O tópico ‘Loop de Attachments Random’ está fechado para novas respostas.