2015-11-06 3 views
2

Я пытаюсь отобразить 6 случайных изображений из галереи на странице id 7 на боковой панели, которая находится на каждой странице веб-сайта.Получить случайные изображения из другой галереи

Это мой код, но я не могу получить ссылку на миниатюру для показа!

$args = array('post_id' => '7', 'post_type' => 'attachment', 'numberposts' => 6, 'orderby' => 'rand'); 

     $attachments = get_posts($args); 

     if ($attachments) { 

      foreach ($attachments as $attachment) { 

       $attachment_id = $attachment(); 

       print_r($attachment()) 

       echo '<a href="' . wp_get_attachment_url() . '"><img src="' . wp_get_attachment_image_src($attachment_id) . '" /></a>'; 

     } 

    } 
+0

http://php.net/manual/en/function.error-reporting.php и вид ваш источник HTML. –

+0

Вы пытаетесь использовать переменную, переданную как исполняемую функцию. http://php.net/manual/en/functions.variable-functions.php –

ответ

3

Ваш запрос неверен. Вы вызываете $attachment() как и id (?!). Когда вы делаете print_r из $attachment в цикле foreach, вы можете видеть, что они явно являются объектами. Поэтому вам нужно получить идентификатор от каждого объекта, указав необходимое значение с помощью ->See here about OOP more.

$args = array(
    'post_id' => '7', 
    'post_type' => 'attachment', 
    'numberposts' => 6, 
    'orderby' => 'rand' 
    ); 

$attachments = get_posts($args); 

if ($attachments) { 
    foreach ($attachments as $attachment) { 
     $attachment_id = $attachment->ID; 
     $image = wp_get_attachment_image_src($attachment_id); 
     if (!empty($image)) { 
      $image_url = $image[0]; 
     } 
     echo '<a href="' . wp_get_attachment_url($attachment_id) . '"><img src="' . $image_url . '" /></a>'; 
    } 
} 

wp_reset_postdata(); 

Также wp_get_attachment_image_src() возвращает массив, содержащий

[0] => url 
[1] => width 
[2] => height 
[3] => boolean: true if $url is a resized image, false if it is the original or if no image is available. 

Так что это массив, я всегда проверяю, если он не пустой (на всякий случай).

После запроса всегда делайте wp_reset_postdata();.

Все.

Объяснение в немного более подробно

Так что вы здесь делаете простой запрос. Вы хотите получить сообщения, которые соответствуют некоторым параметрам, установленным в вашем массиве $args. Вы можете много сделать с этим. Clicky here.

Что делает этот запрос, он возвращает сообщения, соответствующие вашим параметрам запроса. И то, что он возвращает, - это array of objects. Поэтому, если вы хотите получить доступ к каждому из них, вам нужно пройти через loop. И для этого существует цикл foreach.

Foreach будет проходить через каждый элемент вашего массива, и вы сможете получить к нему доступ как $attachment (в вашем случае). Вы можете закодировать любой массив. Простой массив, многомерный массив, массив, содержащий объекты и т. Д.

Итак, мы сказали, что ваш запрос вернет список из objects (массив). Внутри вашей петли foreach $attachment этот единственный объект. В общем, объект - это вещь, которая может содержать много вещей. Свойства, описывающие этот объект, методы (функции в объекте), которые сделают этот объект чем-то, если вы хотите, и т. Д.

Наш объект относительно прост. Он содержит такие свойства, как ID, post_author, post_name, post_type, post_title и другие. В принципе, все, что вам нужно, чтобы найти информацию о вашем посту.

В нашем Еогеасп, как упоминалось выше, вы ссылаетесь один объект с $attachment, и вы можете получить значение из его различных свойств путем ссылки на них, как

$attachment->ID 

это вернет значение ID имущество. Если вы хотите получить сообщение, вы будете ссылаться на

$attachment->post_title 

И так далее.

Таким образом, мы присвоили этому идентификатору переменную $attachment_id. Теперь мы можем свободно использовать его, как мы желаем, с различными выполняемыми Wordpress функциями, например, wp_get_attachment_image_src().

Вам нужно знать, что вы получаете из запросов и в цикле, поэтому всегда хорошо, когда вы разрабатываете материал, до print_r(), что вы выходите.

Кроме того, имейте в виду, что foreach будет проходить через сообщения по одному. Поэтому, даже если ваш print_r($attachment) возвращает кучу сообщений, это означает, что он сделал это несколько раз (ну в вашем случае 6 раз, так как ваш запрос возвращает только 6 сообщений) и просто распечатал его. Все это будет «склеено», чтобы вы подумали: «Но подождите, этот foreach возвращает массу вещей. Как получить только один материал? Но только помните, что код внутри цикла foreach относится к одному экземпляру вашего массива, и что Еогеасп будет идти, как:

item 1 
| 
v 
do stuff with it... 
| 
v 
done (output or whatever you are doing in foreach) 
| 
v 
more items? 
| 
v 
YES! 
| 
v 
move to item 2 
| 
v 
do same stuff with it 
| 
v 
done 
| 
v 
more items? 
| 
v 
YES! 
| 
v 
move to item 3 
. 
. 
. 
| 
v 
more items? 
| 
v 
NO :( 
| 
v 
exit loop 

И вот как Foreach работает, так что не бойтесь его: D

Я пошел немного из колеи, но я надеюсь, что это помогает кто-то в будущем, а также :)

+0

объяснение было бы приятным и для будущих читателей. –

+0

Я добавил, я просто не хотел потерять первое место в ответах;) –

+0

hahaha! gotcha ;-) Посмотрим, что должен сказать OP. * Cheers * –

Смежные вопросы