Привет всем. Хотел бы попросить подсказку, как можно получить данные из цикла за пределами шорткода в тело этого самого шорткода. Пока делается так: PHP: $val1= get_post_meta( $post->ID, 'val1', true); $val2 = get_post_meta( $post->ID, 'val2', true); $val3= get_post_meta( $post->ID, 'val3', true); $val4= get_post_meta( $post->ID, 'val4', true); function the_placemarks() { for ($ii = 0; $i < count($val1);$i++){ $out[$i] = "[placemark='{$val1[$i]}' header='{$val2[$i]}' body='{$val1[$i]}','{$val3[$i]}' footer=<a href='{$val4[$i]}'>'{$val4[$i]}'</a> /]"; }; return $out; }; the_placemarks(); echo do_shortcode('[showyamap]'.the_placemarks().'[/showyamap]'); Результаты данная конструкция не отдаёт. Используется для управляемой генерации точек на карте с использованием плагина. Можно пойти альтернативным путём, а именно запихивать все значения, генерируемые в админке в отдельный метабокс, который можно вывести через отдельное поле, но хотелось бы достичь результата в текущем варианте. Ткните носом, где не вижу ошибку. Спасибо заранее.
1. Зачем вызывать the_placemarks() два раза? Второго достаточно должно быть 2. Внутри the_placemarks() не откуда взяться переменным $val* https://secure.php.net/manual/ru/language.variables.scope.php передавай в аргументах https://secure.php.net/manual/ru/functions.arguments.php 3. Там в for, для чего $ii? Вроде должно быть $i https://secure.php.net/manual/ru/control-structures.for.php 4. Для отладки делал например var_dump(the_placemarks()) чтобы убедиться что она возвращает нужные данные? 5. Функция the_placemarks() как я вижу возвращает массив https://secure.php.net/manual/ru/language.types.array.php а потом ты его пытаешься вывести через echo, не выйдет, надо по очереди вывести каждый ключ массива или склеить в строку с помощью https://secure.php.net/manual/ru/function.implode.php 6. Отступы в коде использую, чтобы было красиво, http://svyatoslav.biz/misc/psr_translation/ PSR-1 – Базовый стандарт оформления кода PSR-2 – Рекомендации по оформлению кода
Привет, спасибо за оперативность. Утром был сонный, предоставил частично некорректный код, за что и извиняюсь. На самом код я использую вот такой: PHP: $val1= get_post_meta( $post->ID, 'val1', true); $val2 = get_post_meta( $post->ID, 'val2', true); $val3= get_post_meta( $post->ID, 'val3', true); $val4= get_post_meta( $post->ID, 'val4', true); function the_placemarks() { for ($i = 0; $i < count($val1);$i++){ $out[$i] = "[placemark='{$val1[$i]}' header='{$val2[$i]}' body='{$val1[$i]}','{$val3[$i]}' footer=<a href='{$val4[$i]}'>'{$val4[$i]}'</a> /]"; }; return $out; }; echo do_shortcode('[showyamap]'.the_placemarks().'[/showyamap]'); Соответственно, пункты 1 и 3 верны. 2. Данные должны бы писаться пользователем в админке в специально отведённые метаполя, которые можно получать в фронтэнде двумя способами - через собственную функцию rwmb_meta ('val1') или через get_post_meta($post->ID,'val1',true); для более точной работы с массивами ( а эти конкретно данные в админке становятся массивами, что подтверждается дампом их на страницу: array(2) { [0]=> string(44) "Таганрог, 9-й переулок, 3А" [1]=> string(34) "Москва, Шолохова, 12" } ) используется последний метод. 4. placemarks пытался через for выводить - данные не даёт. через дамп возвращает NULL. видимо в самой функции и есть проблема. 5. Была идея склеить массивы, но склеивать 4 сразу я пока не умею. 6. Понял, извиняюсь. UPD: В конечном итоге вот такой шорткод PHP: echo do_shortcode('[placemark address="Москва, Люблинская улица, 125" coordinates="55.673483,37.740749" header="Заголовок" body="контент" footer="подвал"/]'); работает, но хотелось бы иметь возможность ставить эти самые placemark более управляемо
про область видимости переменных не понятно? как использовать implode не понятно? --- Добавлено --- PHP: $arr = [ '[placemark...]', '[placemark...]', '[placemark...]', ]; echo implode(PHP_EOL, $arr);
В принципе да, раньше я с этим не сталкивался, поэтому это было в новинку. Изучил. Решил переписать почти всю процедуру вывода, проблема также изменилась: PHP: // создаём отдельный класс для меток class placemark { public $placeholder; public $placeholder_name; public $placeholder_phone; public $placeholder_link; // создаём конструктор public function __construct($placeholder, $placeholder_name, $placeholder_phone, $placeholder_link) { $this->placeholder = $placeholder; $this->placeholder_name = $placeholder_name; $this->placeholder_phone = $placeholder_phone; $this->placeholder_link = $placeholder_link; } // создаём возвращающую функцию public function place_mark() { return '[placemark address="'.$this->placeholder.'" header="'.$this->placeholder_name.'" body="'.$this->placeholder_phone.'" footer="'.$this->placeholder_link.'"/]'; } } // забираем переменные в виде массивов (на это указывает true в конце) из метаполей $map_placeholder = get_post_meta( $post->ID, 'map_placeholder', true); $map_placeholder_name = get_post_meta( $post->ID, 'map_placeholder_name', true); $map_placeholder_phone = get_post_meta( $post->ID, 'map_placeholder_phone', true); $map_placeholder_link = get_post_meta( $post->ID, 'map_placeholder_link', true); // генерируем вывод меток function the_placemarks($map_placeholder, $map_placeholder_name, $map_placeholder_phone, $map_placeholder_link) { $arr_len = count($map_placeholder); for($i = 0; $i < $arr_len; $i++){ $mark[$i] = new placemark( $map_placeholder[$i], $map_placeholder_name[$i], $map_placeholder_phone[$i], $map_placeholder_link[$i] ); return $mark[$i]->place_mark(); } }; echo do_shortcode('[showyamap]'.the_placemarks($map_placeholder, $map_placeholder_name, $map_placeholder_phone, $map_placeholder_link).'[/showyamap]'); Дамп вывода функции возвращает только первую метку: PHP: var_dump(the_placemarks($map_placeholder, $map_placeholder_name, $map_placeholder_phone, $map_placeholder_link)); Код (Text): string(143) "[placemark address="Москва" header="Название" body="+7999999999999" footer="http://example.org"/]" однако, если в функции the_placemarks return $mark[$i] заменить на echo дамп будет уже другим: [placemark address="Москва" header="Название" body="+7999999999999" footer="http://example.org"/][placemark address="Химки" header="Название 2" body="+7999999999998" footer="http://example.org"/][placemark address="Тверь" header="Название 3" body="+7999999999997" footer="http://example.org"/]NULL Почти таким, каким нужно, кроме NULL на конце и неработающей карты, конечно. Подскажите, как это можно исправить?
return делает выход из функции, и цикл for прерывается https://secure.php.net/manual/ru/function.return.php Можно результат в переменную собирать и после цикла вернуть результат из функции, примерно так: Что в коде значит .= https://secure.php.net/manual/ru/language.operators.string.php PHP: $buff = ''; for($i = 0; $i < $arr_len; $i++){ $mark[$i] = new placemark( $map_placeholder[$i], $map_placeholder_name[$i], $map_placeholder_phone[$i], $map_placeholder_link[$i] ); $buff .= $mark[$i]->place_mark(); } return $buff;