Как вызвать внешнюю функцию в цикле WP и получить «следующий» элемент, но для определенных слагов

В рабочей области моей дочерней темы WordPress я пытаюсь узнать, как оптимизировать приведенный ниже код, чтобы повысить эффективность процесса PHP. Всего у меня 10 изображений, с которыми я работаю. Я хочу, чтобы любое количество этих изображений вызывалось на разных страницах слизнем. Я знаю в PHP, как один раз вернуться из функции, но как мне сказать в PHP...

  • "Хочу, чтобы фото 1, 2, 6 отправились к slugA"
  • "Я хочу, чтобы фото 2, 3, 5, 9 отправились к slugB"
  • "Я хочу, чтобы фотографии 1, 7 отправились к slugC"
  • и т. д...

Это то, что у меня есть до сих пор


//DEFINING ALL MY PHOTOS AND RETURNING THEM

function my_post_photos (
  $mQuery = 1,
  $image01 = "filler_01.jpg",
  $image02 = "filler_02.jpg",
  $image03 = "filler_03.jpg",
  $image04 = "filler_04.jpg",
  $image05 = "filler_05.jpg",
  $image06 = "filler_06.jpg",
  $image07 = "filler_07.jpg",
  $image08 = "filler_08.jpg",
  $image09 = "filler_09.jpg",
  $image10 = "filler_10.jpg"
  ): string
{
  $vars = get_defined_vars();
  foreach ($vars as $key => $value) {
    $placeholders[] = get_stylesheet_directory_uri() . '/dist/images/' . $value;
  }

  return $placeholders[$mQuery];
}


//FURTHER DOWN THIS SAME PAGE...WITHIN MY WP LOOP, CALLING THEM

<?php 
$query = new WP_Query($args);
if ($query->have_posts()) :
   //WITH THE BELOW $i, I AM FULLY AWARE THAT THE NUMBER OF PHOTOS LOADS IS DEPENDENT ON HOW MANY TIMES MY LOOP CYCLES.  I'M COOL WITH THAT BECAUSE I'M EVENTUALLY GOING TO HAVE MORE PHOTOS THAN POSTS.
   $i=1;
     while ($query->have_posts()) : $query->the_post(); 
       $current_page = sanitize_post($GLOBALS['wp_the_query']->get_queried_object());
       $slug = $current_page->post_name;
  ?>
  
  <?php
    if ($slug == "slugA") {
    ?>
      <div>
        <h6>
          <!-- //THIS FUNCTION LOADS EACH PHOTO PERFECTLY FINE, BUT HOW CAN I ONLY RETURN PHOTOS 1, 2, 6 HERE? -->
          <img src = "<?php echo my_career_placeholder($i); ?>" border = "0" alt = "">
        </h6>
       </div>
       <?php
       } elseif ($slug = "slugB") {
         //HOW CAN I RETURN ONLY PHOTOS 2, 3, 5, 9 HERE?
       } elseif ($slug = "slugC") {
         //HOW CAN I RETURN ONLY PHOTOS 1, 7 HERE?
       }
       ?>
      <?php 
        $i++;
        endif;
        endwhile; 
        endif;
        wp_reset_postdata();
  ?>

Сигнатура вашей основной функции очень странная, если вы действительно не собираетесь разрешать вызывающим абонентам изменять имена файлов изображений при вызове. Мне кажется, это выглядит более правильным/нормальным: 3v4l.org/HICKU

Chris Haas 16.02.2023 22:47

Я только что сделал обновление для него. Спасибо!

klewis 16.02.2023 22:54

Не полностью связано с вашим вопросом, но если у вас нет особой потребности, я обычно направляю людей к get_posts, а не к выделенным WP_Query. Однако ваш код никоим образом не является неправильным.

Chris Haas 16.02.2023 22:59

По вашему мнению, что было бы преимуществом или преимуществом, если бы я сделал этот переход?

klewis 16.02.2023 23:01

Резюме заключается в том, что он «возвращает массив сообщений, не изменяет глобальные переменные и безопасен для использования где угодно», однако, чтобы узнать больше, я просто рекомендую вам прочитать сообщение, на которое я ссылаюсь, в нем гораздо больше Информация и нюанс. Однако, как я уже сказал, ваш код не является неправильным, это просто то, к чему я подталкиваю людей.

Chris Haas 16.02.2023 23:10
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Еще один бенчмарк PHP
Еще один бенчмарк PHP
Сегодня я наткнулся на забавный пост на r/ProgrammerHumor, который заставил меня задуматься об одной вещи, которая меня всегда интересовала....
Преобразование данных с помощью красноречивых аксессоров и мутаторов в Laravel
Преобразование данных с помощью красноречивых аксессоров и мутаторов в Laravel
Laravel поставляется с мощной функцией под названием "Eloquent Accessors and Mutators".
0
5
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на ваш код в целом, я думаю, что вашу основную функцию можно было бы переписать следующим образом:

function my_post_photos(...$indexes): array
{
    $pathPrefix = get_stylesheet_directory_uri().'/dist/images/';

    $placeholders = [
        $pathPrefix.'filler_01.jpg',
        $pathPrefix.'filler_02.jpg',
        $pathPrefix.'filler_03.jpg',
        $pathPrefix.'filler_04.jpg',
        $pathPrefix.'filler_05.jpg',
        $pathPrefix.'filler_06.jpg',
        $pathPrefix.'filler_07.jpg',
        $pathPrefix.'filler_08.jpg',
        $pathPrefix.'filler_09.jpg',
        $pathPrefix.'filler_10.jpg',
    ];

    $ret = [];
    foreach ($indexes as $index) {
        if (isset($placeholders[$index])) {
            $ret[] = $placeholders[$index];
        }
    }

    return $ret;
}

Это позволит вам вызвать его и передать столько индексов, сколько вы хотите, выполнив my_post_photos(3,5), что вернет массив, который вы можете перебрать.

Демо здесь: https://3v4l.org/8aq6d

Дополнительные оптимизации могут быть выполнены, если вы действительно назовете свои изображения в такой последовательной манере, но пока я делаю это просто.

Редактировать

Основываясь на ваших комментариях, я думаю, вы хотите вызвать функцию в цикле и получить «следующий» элемент, но для конкретного слага.

Если это так, один из способов сделать это — создать второй массив, который сопоставляет слаги с индексами изображений. Затем вы можете использовать static с этим массивом, что означает, что последующие вызовы функции не будут воссоздавать массив, а вместо этого будут использовать первый. Наконец, вы можете использовать array_shift, который доставит вам первый элемент из массива и фактически удалит этот индекс из массива. (Функция array_shift считается неэффективной для больших массивов, если я правильно понимаю, но я не думаю, что вы вообще это заметите здесь.)

Приведенный ниже код меняет это обратно на возврат строки (или нуля) и может вызываться повторно с известным слагом для получения «следующего» элемента. Если у вас когда-либо будет больше сообщений, чем изображений, вы можете взять «следующий» и добавить его в конец массива, что также даст вам циклический пул.

function my_post_photos(string $slug): ?string
{
    $pathPrefix = get_stylesheet_directory_uri().'/dist/images/';

    $placeholders = [
        $pathPrefix.'filler_01.jpg',
        $pathPrefix.'filler_02.jpg',
        $pathPrefix.'filler_03.jpg',
        $pathPrefix.'filler_04.jpg',
        $pathPrefix.'filler_05.jpg',
        $pathPrefix.'filler_06.jpg',
        $pathPrefix.'filler_07.jpg',
        $pathPrefix.'filler_08.jpg',
        $pathPrefix.'filler_09.jpg',
        $pathPrefix.'filler_10.jpg',
    ];
    
    // Mapping of slugs to placeholders
    // NOTE: This array is created static so that it only ever
    // gets created once in the lifetime of the PHP request
    static $slugToPlaceholders = [
        'slugA' => [1, 2, 6],
        'slugB' => [2, 3, 5, 9],
        'slugC' => [1, 7],
    ];
    
    // Unknown slug, return null
    if (!isset($slugToPlaceholders[$slug])){
        return null;
    }
    
    // Grab the next unused index, and remove it from the array
    $nextIndex = array_shift($slugToPlaceholders[$slug]);
    
    // Return either the image or nothing if we're out of indexes
    return $placeholders[$nextIndex] ?? null;
}

Демо: https://3v4l.org/JDKOH

Такое ощущение, что он почти там. Просто получаю небольшое уведомление PHP, в котором говорится: «Уведомление: преобразование массива в строку ...» в строке, когда я запускаю ` <img src = "<?php echo my_post_photos(1,3,5); ?>" border= "0" alt = "">`

klewis 16.02.2023 23:09

Да. Этот код теперь всегда будет возвращать массив, поэтому вам нужно всегда перебирать этот массив. Если я неправильно понял ваше "КАК Я МОГУ ВЕРНУТЬ ЗДЕСЬ ТОЛЬКО ФОТОГРАФИИ 2, 3, 5, 9?" то я бы изменил функцию.

Chris Haas 16.02.2023 23:13

Это было огромной помощью. Я многому учусь. есть только одна проблема, которую я пытаюсь решить с помощью этого подхода. Если мы запустим функцию foreach «внутри цикла wp», например так: `foreach (my_post_photos(1,2) as $imagePath) {`, цикл будет вызывать индекс 1 каждый раз, когда он зацикливается. он должен вызвать индекс 1 только один раз, а затем на следующей итерации вызвать 2. Похоже, нам нужно $i, чтобы проверить, найдено ли его значение в каком-либо из ...$индексов. если это так, то обработайте функцию .... просто мысль. Я пробую вещи.

klewis 16.02.2023 23:44

@klewis, я отредактировал свой ответ, указав то, чего, по моему мнению, вы хотите достичь

Chris Haas 17.02.2023 00:36

Абсолютно потрясающе. Ваше последнее решение - чистое золото для моей текущей задачи. Спасибо за помощь в изучении некоторых замечательных вещей с PHP!

klewis 17.02.2023 04:57

Другие вопросы по теме