Нарезать цикл foreach или преобразовать его в цикл for? - PullRequest
0 голосов
/ 16 ноября 2018

Я создал пользовательский тип записи и использовал CMB2, чтобы добавить в него опцию загрузки файлов, которая позволяет загружать несколько файлов.Я использую следующий код в файле single.php для вывода всех файлов, которые были загружены.

$files = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $files != '' ) {
echo '<div class="ad-photos">';
// Loop through them and output an image
foreach ( (array) $files as $attachment_id => $attachment_url ) {
    echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
}
echo '</div>';
}

Этот код работает хорошо.Теперь мне нужен код, который будет выводить только первый загруженный файл.Я интенсивно искал это и нашел много разных способов сделать это.Из того, что я могу собрать, лучший способ - использовать array_slice.Я прочитал все, что я могу о array_slice и перепробовал все что угодно, но я не могу понять, как внедрить его в мой код.

Это был мойЛучшая логическая попытка:

$otherfiles = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $otherfiles != '' ) {
// Loop through them and output an image
$otherfiles = array_slice( $otherfiles, 0,1);
foreach ( $otherfiles as $attachment_id => $attachment_url ) {
    echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
}
}

И, похоже, это меня сближает, потому что это заставляет его зацикливаться только один раз, но фактически не захватывает URL файла.Он просто выводит пустой тег <a>.

Мне кажется, что я просто упускаю что-то простое здесь, но я прочитал все, что могу найти, и попробовал все, что мог придумать, и не могу понять этоиз.Приведенный выше код является наиболее близким, который я получил из множества различных методов.

Любая помощь или толчок в правильном направлении приветствуется.И если есть лучший способ сделать это, я весь слух!Я также попытался использовать цикл for вместо этого, поскольку некоторые люди говорят, что это лучший вариант, но я не смог выяснить, как изменить код, который у меня есть, в цикл for.Так что если кто-нибудь сможет показать мне, как это сделать, я буду очень благодарен.Я скопировал код, который я использую, из документации CMB2, и я просто не понимаю его достаточно хорошо, чтобы правильно его изменить, я думаю.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Я думаю, что вы ищете просто:

reset($theArray);
0 голосов
/ 16 ноября 2018

Несколько вариантов

1. Используйте Перерыв

$files = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $files != '' ) {
    echo '<div class="ad-photos">';
    foreach ( (array) $files as $attachment_id => $attachment_url ) {
        echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
        break; // Stops Execution after the first time
    }
    echo '</div>';
}

2. Используйте Array Keys и получите только первый

$files = get_post_meta( get_the_ID(), $file_list_meta_key, 1 );
if( $files != '' ) {
    echo '<div class="ad-photos">';
    $attachment_id = array_keys((array) $files)[0];
    echo '<a href="' . wp_get_attachment_url( $attachment_id) . '" data-fancybox="group" >' . wp_get_attachment_image( $attachment_id, $img_size ) . '</a>';
    echo '</div>';        
}

Кстати, не похоже, что вам нужна переменная $attachment_url, поскольку вы фактически получаете URL из последующей функции wp_get_attachment_url()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...