В рабочей области моей дочерней темы WordPress я пытаюсь узнать, как оптимизировать приведенный ниже код, чтобы повысить эффективность процесса PHP. Всего у меня 10 изображений, с которыми я работаю. Я хочу, чтобы любое количество этих изображений вызывалось на разных страницах слизнем. Я знаю в PHP, как один раз вернуться из функции, но как мне сказать в PHP...
Это то, что у меня есть до сих пор
//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();
?>
Я только что сделал обновление для него. Спасибо!
Не полностью связано с вашим вопросом, но если у вас нет особой потребности, я обычно направляю людей к get_posts, а не к выделенным WP_Query. Однако ваш код никоим образом не является неправильным.
По вашему мнению, что было бы преимуществом или преимуществом, если бы я сделал этот переход?
Резюме заключается в том, что он «возвращает массив сообщений, не изменяет глобальные переменные и безопасен для использования где угодно», однако, чтобы узнать больше, я просто рекомендую вам прочитать сообщение, на которое я ссылаюсь, в нем гораздо больше Информация и нюанс. Однако, как я уже сказал, ваш код не является неправильным, это просто то, к чему я подталкиваю людей.
Глядя на ваш код в целом, я думаю, что вашу основную функцию можно было бы переписать следующим образом:
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 = "">`
Да. Этот код теперь всегда будет возвращать массив, поэтому вам нужно всегда перебирать этот массив. Если я неправильно понял ваше "КАК Я МОГУ ВЕРНУТЬ ЗДЕСЬ ТОЛЬКО ФОТОГРАФИИ 2, 3, 5, 9?" то я бы изменил функцию.
Это было огромной помощью. Я многому учусь. есть только одна проблема, которую я пытаюсь решить с помощью этого подхода. Если мы запустим функцию foreach «внутри цикла wp», например так: `foreach (my_post_photos(1,2) as $imagePath) {`, цикл будет вызывать индекс 1 каждый раз, когда он зацикливается. он должен вызвать индекс 1 только один раз, а затем на следующей итерации вызвать 2. Похоже, нам нужно $i, чтобы проверить, найдено ли его значение в каком-либо из ...$индексов. если это так, то обработайте функцию .... просто мысль. Я пробую вещи.
@klewis, я отредактировал свой ответ, указав то, чего, по моему мнению, вы хотите достичь
Абсолютно потрясающе. Ваше последнее решение - чистое золото для моей текущей задачи. Спасибо за помощь в изучении некоторых замечательных вещей с PHP!
Сигнатура вашей основной функции очень странная, если вы действительно не собираетесь разрешать вызывающим абонентам изменять имена файлов изображений при вызове. Мне кажется, это выглядит более правильным/нормальным: 3v4l.org/HICKU