Случайно показать изображение + ссылку в html шаблоне рассылки - PullRequest
0 голосов
/ 19 февраля 2020

Допустим, у меня есть список из 4 изображений, и я пытаюсь случайным образом показать 2 из них при каждой загрузке бюллетеня.

У меня есть файл show_image. php со следующим кодом:


$images = array(
  0 => array(
    'image' => 'http://example.com/img/partner1.jpg',
    'link' => 'http://www.example1.com'
  ),
  1 => array(
    'image' => 'http://example.com/img/partner2.jpg',
    'link' => 'http://www.example2.com'
  ),
  2 => array(
    'image' => 'http://example.com/img/partner3.jpg',
    'link' => 'http://www.example3.com'
  ),
  3 => array(
    'image' => 'http://example.com/img/partner4.jpg',
    'link' => 'http://www.example4.com'
  )
);

$i = 0
foreach($images as $image)
{
  $i++;
  $zones[$i][] = $image;
  if($i == 2)
    $i = 0;
}

if(!empty($zones[$_GET['zone']]))
{
    $zone = $zones[$_GET['zone']];
    $random_index = array_rand($zone);
    $partner = $zone[$random_index];

    if($_GET['field'] == 'image')
    {
        $file = getFullPath($partner['image']);

        $type = 'image/jpeg';
        header('Content-Type:'.$type);
        header('Content-Length: ' . filesize($file));
        readfile($file);
    }
    elseif($_GET['field'] == 'link')
    {
        wp_redirect( $partner['link'], 301);
        exit();
    }
}

В моей текущей ситуации изображения в шаблоне рассылки (html) выглядят следующим образом:

<a href="http://example.com/show_image.php?zone=1&field=link">
  <img src="http://example.com/show_image.php?zone=1&field=image">
</a>
<a href="http://example.com/show_image.php?zone=2&field=link">
  <img src="http://example.com/show_image.php?zone=2&field=image">
</a>

Как видите, вызов случайного изображения и ссылки разделяются, что приводит к тому, что скрипт php отвечает случайной ссылкой, которая не соответствует случайному изображению.

Может ли кто-нибудь указать мне правильное направление, как случайным образом показать изображение с соответствующей соответствующей ссылкой

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

может быть несколько решений, все они имеют положительные и отрицательные стороны:

  1. Вместо файла stati c html с жестко закодированными ссылками, вы можете создавать страницы на лету с php, таким образом, вы будете генерировать случайное число для каждой зоны и выводить html с соответствующими ссылками / изображениями

1.1. Вы можете использовать iframe для загрузки изображения и формы ссылки php server

Если вам нужно использовать stati c html и javascript, вы можете выполнить ajax вызов php с помощью javascript, который снова получит изображение и ссылку и будет использовать их для сгенерировать html код (document.write или внутренний HTML)

Вы можете попробовать использовать куки или механизм сессии, в этом случае в php коде у вас будет ветка if number for zone is not generated yet - generate and store in cookie/session; return link or image for number from cookies/session

Чтобы изменить код для # 3, вам необходимо заменить

 $random_index = array_rand($zone);

на что-то вроде (запись без фактического php, поэтому синтаксические ошибки возможно):

$cook = 'zone' . $_GET['zone'];
$random_index = isset($_COOKIE[$cook]) ? $_COOKIE[$cook] : array_rand($zone);
setcookie($cook, $random_index);

примечание - вы должны поставить правильную проверку для любых переменных из GET или COOK IE

В случае почтовых клиентов - большинство из них ограничивают выполнение кода javascript и не хранят куки (и с точки зрения пользователя, очень хорошо, что они это делают), в любом случае вы можете попробовать что-то например:

  • при отправке электронной почты генерировать уникальный идентификатор для каждого отправленного электронного письма (для этого вы можете использовать UUID)
  • включить этот идентификатор в ссылки в вашем шаблоне, например <a href="http://..../?...&id=UUID"><img src="http://.../?..&id=UUID"></a>
  • в изображении и обработчике кликов - вам нужно получить идентификатор из URL и проверить в базе данных - присвоили ли вы ему значение, а если нет - сгенерировать и сохранить в db
  • , если значение в db присутствует - теперь вы можете обслуживать соответствующее изображение или перенаправлять на соответствующий URL
  • , но в этой схеме - пользователям всегда будет представлено одно и то же изображение (хотя разные пользователи будут видеть разные), чтобы исправить это, вы можете ввести некоторый срок действия, ie поставить метку времени в дБ и сделать недействительным (регенерировать) значение

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

другие примечания:

  1. не забудьте о заголовках http без кэша для обслуживания изображения
  2. не используйте постоянные перенаправления, только временные для вашего случая использования
  3. некоторые почтовые клиенты не будут загружать изображения, которые не встроены в сообщение, для таких вы можете играть с <noscript> и встроенными изображениями некоторых случайно выбранных объявление
0 голосов
/ 19 февраля 2020

Во-первых, в вашем коде есть синтаксическая ошибка. Все ваши дочерние массивы пропускают запятую:

0 => array(
    'image' => 'http://example.com/img/partner1.jpg' // <-- Error
    'link' => 'http://www.example1.com'
  )

Должно быть:

0 => array(
    'image' => 'http://example.com/img/partner1.jpg', // <-- Fixed
    'link' => 'http://www.example1.com'
  )

Вы должны использовать rand () , чтобы получить изображение случайным образом:

$images = array(
    0 => array(
      'image' => 'http://example.com/img/partner1.jpg',
      'link' => 'http://www.example1.com'
    ),
    1 => array(
      'image' => 'http://example.com/img/partner2.jpg',
      'link' => 'http://www.example2.com'
    ),
    2 => array(
      'image' => 'http://example.com/img/partner3.jpg',
      'link' => 'http://www.example3.com'
    ),
    3 => array(
      'image' => 'http://example.com/img/partner4.jpg',
      'link' => 'http://www.example4.com'
    )
  );

$total_images = count($images) - 1; // Get total number of images. Deducted one because arrays are zero-based

$random_img = rand(0, $total_images); // Get a random number between 0 and $total_images

echo $images[$random_img]['image'] . '<br />';
echo $images[$random_img]['link'] . '<br />';
...