Как правильно использовать функцию php?

Ссылка скопирована
1 ответ

Всем привет! У меня есть вот такой вызов функции:

$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); }

Дополнительно:

Этому коду плевать на тип записи. Он берёт значение ПП из конкретной записи.

  • Делаете функцию с общим аргументом, возвращаете другую функцию с этим аргументом, либо какая то логика исходя из аргумента
  • Функции с префиксом get_ по логике WP должны возвращать данные return, а не выводить echo
  • Refguser, я знаю, у меня просто для каждого типа записи свой набор разных функций выполняется.... и во всех типах записей одинаковый этот блок кода, поэтому хочу вынести его в отдельную функцию
  • Дмитрий, Дмитрий, а можно пример? а то не сильно понял
  • Артем Золин, get_repeater - это я сам написал, это не ВП функция.... могу написать так my_repeater .... тут задача как тот блок что я вывожу черех эко - вернуть с функции через return
  • sputnickk, ну видимо не знаешь, раз зачем-то его показываешь и спрашиваешь про другие типы записей. И поэтому не понимаешь где и почему "дублируется".
    В общем это как спрашивать посему яблоки кислые, показывая апельсины.
  • Refguser,

    В общем это как спрашивать посему яблоки кислые, показывая апельсины.

    именно, так как вопрос был совсем в другом - как ретерном вернуть блок...

  • Ответы:

    Сразу извинюсь за душнила 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.

    Как правильно использовать функцию php?

    Завертываем код в функцию

    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 в функцию, тут уж как удобно.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ольга Сеть Ответ

    Для 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) . '';
        }
    }

    $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() без проверки, что значение массив;
    • не выводите последнюю запятую вручную;
    • не вставляйте HTML в JSON без экранирования;
    • schema должна соответствовать видимому FAQ на странице;
    • не добавляйте FAQPage на страницы, где FAQ реально не показан.

    Если поле ACF Repeater, названия ключей будут зависеть от Ваших sub fields. Например, это могут быть faq_question и faq_answer, а не question/answer. Проверьте структуру через var_dump($faqs) на локальной копии или посмотрите названия полей в ACF.

    Также лучше подключать этот вывод через hook в wp_head только для нужных записей, а не прямо в середине шаблона. Но если блок FAQ выводится внутри шаблона, script с JSON-LD можно оставить ниже по странице — поисковики его увидят.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно