Создание шорткода из результатов функции array_rand - PullRequest
0 голосов
/ 18 октября 2018

Файл functions.php моего сайта WordPress в настоящее время содержит блоки кода, подобные этому:

function examplecode01() { 
$i = '<a href="/path/" class="exampleclass" id="example-code-01"><img class="example01imgclass" src="path/example01.jpg" alt="Example 01"/></a>';
return $i;
} 
add_shortcode('example-code-01', 'examplecode01');

Существует 5 или более из них, каждый со своими соответствующими вариантами "пример кода ##и такие, как описано выше.Строка шорткода позволяет редактору указать шорткод и вставить определенное изображение баннера в запись блога (используя первый параметр add_shortcode) следующим образом:

[example-code-01]

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

Работая в этом направлении, я немного изменил приведенный выше блок кода следующим образом:

function examplecode01() { 
echo '<a href="/path/" class="exampleclass" id="example-code-01"><img class="example01imgclass" src="path/example01.jpg" alt="Example 01"/></a>;
}  

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

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

$functions = array('examplecode01', 'examplecode02', 'examplecode03', 'examplecode04', 'examplecode05'); 
$functions[array_rand($functions)]();

Когда я добавляю это в пустой PHP-файл (для тестирования) и запускаю его онлайн, он выводит случайное изображение баннераиз тех, что я перечислил.Ура!Успех ... вроде.

Видите, что мне нужно сейчас - это способ для редакторов вызвать этот случайный результат с помощью шорткода.Хотя я не уверен на 100%, как это сделать.Исходный шорткод в основном был [«id, используемый в блоке кода», «имя функции»]

Я думал об установке результата в переменную и последующем вызове этой переменной, но я все еще не уверен, как он"конвертирует" (так сказать) в шорткод ...

Может кто-нибудь помочь мне с этой последней частью головоломки?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Создание шорткода из результатов функции array_rand

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

Если вам нужен короткий код, который возвращаетслучайный баннер, что-то вроде этого может работать:

function random_banner() {
    $banner_indexes = ['01', '02', '03', '04', '05'];
    $index = $banner_indexes[array_rand($banner_indexes)];

    return sprintf('<a href="/path/" class="exampleclass" id="example-code-%s"><img class="example%simgclass" src="path/example%s.jpg" alt="Example %s"/></a>', $index, $index, $index, $index);
}

add_shortcode('random-banner', 'random_banner');
0 голосов
/ 18 октября 2018

Вот как бы я это сделал

function examplecode01(){
    return __FUNCTION__;
}

function examplecode02(){
    return __FUNCTION__;
}

function examplecode03(){
    return __FUNCTION__;
}

function examplecode04(){
    return __FUNCTION__;
}

function examplecode05(){
    return __FUNCTION__;
}

function examplecode() { 
    $functions = array('examplecode01', 'examplecode02', 'examplecode03', 'examplecode04', 'examplecode05'); 
    shuffle($functions); //randomize array
    $function = array_shift($functions); //get first array element

    return function_exists($function) ? $function() : '';
} 
//add_shortcode('example-code-random', 'examplecode');

echo examplecode();

Песочница

* "Волшебная" константа __FUNCTION__ - это имя текущей функции, вы можетезамените его своим реальным кодом, это просто упрощает просмотр того, какая функция была вызвана.

Если честно, вместо того, чтобы делать это examplecode01 и examplecode02 (итерационные функции), я бы просто сделал один короткий код(чтобы управлять ими всеми), например:

[examplecode]  //random
[examplecode banner="1"] //examplecode01

И так далее, это будет легко расширить позже.Примерно так:

function examplecode($attr) { 
    $banners = array('example01.jpg', 'example02.jpg', 'example03.jpg', 'example04.jpg', 'example05.jpg'); 
    $atts = shortcode_atts(array(
        'banner' => false
    ), $atts );

    if($atts['banner'] && isset($banners[$atts['banner']-1])){
        //make sure to check if the index exists
        //you could handle this differently, such as not show a banner, show an error message etc...
        $index =  $atts['banner']-1;  //0 based vs 1 based
    }else{
        $index = rand(0, (count($banners)-1));
    }

    //pad with a leading 0 if less then 2
    $i = str_pad($index+1, 2, '0', STR_PAD_LEFT);       

    return '<a href="/path/" class="exampleclass" id="example-code-'.$i.'"><img class="example'.$i.'imgclass" src="path/'.$banners[$index].'" alt="Example '.$i.'"/></a>';
} 
add_shortcode('examplecode', 'examplecode');

Посмотрите, если вы сделаете function{n} и хотите добавить баннер, вам нужно создать совершенно новую функцию и шорткод.Однако, если вы используете атрибуты шорткода, вам нужно только добавить изображение в массив.Нет атрибута banner, это случайно, в противном случае это номер изображения баннера из массива.Есть немного покачиваний, чтобы ваши баннеры основывались на 1, потому что массивы основаны на 0.Вы можете упростить это, начав вместо 0.Но что бы ни ...

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

if(!function_exists('examplecode')){
    function examplecode($attr) { ... }
}

По сути, это мешает ему определить функцию, если она уже была определена.

...