Как правильно использовать функцию php?
Всем привет! У меня есть вот такой вызов функции:
$repeater = get_post_meta( $post_id, 'faqshema', true); $cnt = count($repeater); echo ' <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ '; foreach($repeater as $one){ echo ' { "@type": "Question", "name": "'; echo $one['question']; echo '", "acceptedAnswer": { "@type": "Answer", "text": "'; echo $one['answer']; echo '" } }'; if($cnt > 1) {echo ',' ;} $cnt --; }//foreach echo ' ] } </script> '; |
$repeater = get_post_meta( $post_id, 'faqshema', true); $cnt = count($repeater); echo ' <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ '; foreach($repeater as $one){ echo ' { "@type": "Question", "name": "'; echo $one['question']; echo '", "acceptedAnswer": { "@type": "Answer", "text": "'; echo $one['answer']; echo '" } }'; if($cnt > 1) {echo ',' ;} $cnt --; }//foreach echo ' ] } </script> ';
Код берет данные вопрос/ответ с произвольного поля текущей записи и выводит в футер... Все работает, все ок.
Сейчас этот код работает для двух типов записи, и надо еще чтобы работал для двух дополнительно.... Получается что этот код дублируется 4 раза.... Что не очень хорошо... что то смениться и потом в 4 местах менять.... Хочу завернуть этот код в функцию и в нужном месте для нужного типа записи просто дергать функцию, например так:
//выводим микроразметку faq для событий get_repeater(get_the_ID()); //в другом файле у меня лежит сама функция: get_repeater(){ //В php не силен и вот тут я не знаю как собрать всю ту разметку в одну строку и вернуть через return($stringFaq); } |
//выводим микроразметку faq для событий get_repeater(get_the_ID()); //в другом файле у меня лежит сама функция: get_repeater(){ //В php не силен и вот тут я не знаю как собрать всю ту разметку в одну строку и вернуть через return($stringFaq); }
Дополнительно:
Этому коду плевать на тип записи. Он берёт значение ПП из конкретной записи.
В общем это как спрашивать посему яблоки кислые, показывая апельсины.
В общем это как спрашивать посему яблоки кислые, показывая апельсины.
именно, так как вопрос был совсем в другом - как ретерном вернуть блок...
Ответы:
Сразу извинюсь за душнила mode on. Иногда я забываю за что хейтят PHP, когда я вижу подобный код, то спускаюсь на землю.
1. Не надо делать echo в функции, если делаете echo, то и называйте функцию echoMeta, но все равно, каноничнее возвращать результат.
2. get_the_ID - ужасное название. Что за the? Это какой-то божественный id? Почему id большими буквами? Я понимаю когда идет спор getJson или getJSON, но в случае с get_json уже споров нет.
3. Зачем вы пытаетесь изобрести вывод JSON? У вас любая ковычка в данных положит страницу. Сформируйте объект и штатными средствами сгенерируйте json.
4. Разделите логику и шаблон, на эти куски echo больно смотреть, хотя в WP это канон.
Где вывод пишешь do_action().
В function добавляешь add_action
По канонам wp.
Завертываем код в функцию
function generateFaqSchema($postId) { $repeater = get_post_meta($postId, 'faqshema', true); $count = count($repeater); $jsonLd = [ "@context" => "https://schema.org", "@type" => "FAQPage", "mainEntity" => [] ]; foreach ($repeater as $item) { $question = $item['question']; $answer = $item['answer']; $jsonLd['mainEntity'][] = [ "@type" => "Question", "name" => $question, "acceptedAnswer" => [ "@type" => "Answer", "text" => $answer ] ]; $count--; if ($count > 0) { $jsonLd['mainEntity'][] = ','; } } return ' <script type="application/ld+json"> ' . json_encode($jsonLd) . ' </script> '; } |
function generateFaqSchema($postId) { $repeater = get_post_meta($postId, 'faqshema', true); $count = count($repeater); $jsonLd = [ "@context" => "https://schema.org", "@type" => "FAQPage", "mainEntity" => [] ]; foreach ($repeater as $item) { $question = $item['question']; $answer = $item['answer']; $jsonLd['mainEntity'][] = [ "@type" => "Question", "name" => $question, "acceptedAnswer" => [ "@type" => "Answer", "text" => $answer ] ]; $count--; if ($count > 0) { $jsonLd['mainEntity'][] = ','; } } return ' <script type="application/ld+json"> ' . json_encode($jsonLd) . ' </script> '; }
Там где нужно, вызываем функцию и передаем любые параметры:
echo generateFaqSchema(get_the_ID());
- ага, и тогда return не нужен, т к тут эко, спасибо, пробую.
- sputnickk, return нужен внутри функции, чтобы содержимое отдало, а через echo уже вывод где эту функцию вызываем. Либо сразу echo в функцию, тут уж как удобно.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для FAQ schema не стоит собирать JSON руками через много
echo. В таком коде легко получить лишнюю запятую, неэкранированные кавычки, сломанный JSON или XSS, если текст вопроса/ответа приходит из админки. Правильнее собрать PHP-массив и вывести его черезwp_json_encode().Пример:
$faqs = get_post_meta(get_the_ID(), 'faqshema', true); if (!empty($faqs) && is_array($faqs)) { $entities = []; foreach ($faqs as $item) { $question = isset($item['question']) ? wp_strip_all_tags($item['question']) : ''; $answer = isset($item['answer']) ? wp_kses_post($item['answer']) : ''; if ($question === '' || $answer === '') { continue; } $entities[] = [ '@type' => 'Question', 'name' => $question, 'acceptedAnswer' => [ '@type' => 'Answer', 'text' => wp_strip_all_tags($answer), ], ]; } if ($entities) { $schema = [ '@context' => 'https://schema.org', '@type' => 'FAQPage', 'mainEntity' => $entities, ]; echo '<script type="application/ld+json">' . wp_json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ''; } }
Важные моменты:
count()без проверки, что значение массив;Если поле ACF Repeater, названия ключей будут зависеть от Ваших sub fields. Например, это могут быть
faq_questionиfaq_answer, а неquestion/answer. Проверьте структуру черезvar_dump($faqs)на локальной копии или посмотрите названия полей в ACF.Также лучше подключать этот вывод через hook в
wp_headтолько для нужных записей, а не прямо в середине шаблона. Но если блок FAQ выводится внутри шаблона, script с JSON-LD можно оставить ниже по странице — поисковики его увидят.