GP Blocks / structured data / faq
-
Hi David,
Iād like to embed structured data into a FAQ section built with two GB containers and headline blocks.
An online generator tool like this would provide me with the JSON-LD to add to an HTML block.
This issue is that this JSON-LD includes both question and answer into the same snippet. For my template, however, I need two code snippets, one for the question and one for the answer.
When I look at the html of the Yoast FAQ block they seem to use and ID in order to a questions to the relevant answer (see screenshot).
How would you go about splitting the following:
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "This is the Question.", "acceptedAnswer": { "@type": "Answer", "text": "Here comes the Answer." } } ] } </script>Any advise would be much appreciated.
Best,
JanThe page I need help with: [log in to see the link]
-
Hi there,
I am not sure i fully understand what the issue is.
If its because you have:1 x JSON-LD snippet for the FAQ
2 x Container Blocks to display then Question and the AnswerThen this should not be an issue.
The search engine reads the JSON-LD. The human reads the displayed HTML.
Yes google will check that the Question and Answers in the JSON-lD are visible to the reader but to my knowledge there is no coded connection between the two.Let me know what i am missing
Hi David,
yes, you got this right. There are two container blocks, one is supposed to contain the questions, the other holds the related answer.
I understand that could place the script including question and answer for Google in one place and the same information for the user visible in a different format.
The problem with that is that I’ll need to maintain both answers and questions in two places.
Alternatively, I created this structure that splits the script into two and places relevant parts into the different container. Then I added the
nameandtextattributes as an HTML tag to the subsequent text blocks inside the same container.Will this direction lead us anywhere meaningful š
Any thoughts are much appreciated.
Best,
JanI am no expert on the JSON-LD schema, but i do not believe you can split the JSON script into two.
How many Questions and Answers are there to be on each page ?
Hi David,
only one question an one answer on each page.
The challenge comes with the total number of 100+ pages ;-/
Best,
JanHave you thought about using Custom Fields to store the Question and Answer.
You can then:1. Use the Headline Block Dynamic Data -> Content Source -> Post Meta -> Field name to display the Question, and again the Answer
2. Then use a PHP Snippet to print your Schema in the
<head>of your site. eg.add_action( 'wp_head', 'db_print_faq_json', 99 ); function db_print_faq_json() { // Check if its a single post if ( is_single() ) { // Get Custom field: question and answer global $post; $question = get_post_meta( $post->ID, 'question', true ); $answer = get_post_meta( $post->ID, 'answer', true ); // if both question and answer are present print JSON if ( $question && $answer ) { printf(' <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "%1$s", "acceptedAnswer": { "@type": "Answer", "text": "%2$s" } } ] } </script>', $question, $answer ); } } }Notes:
a.
if ( is_single() ) {this condition first checks if your on a single post. Change this condition if you’re using a specific post type for your FAQsb. these two lines is where we grab the custom fields:
$question = get_post_meta( $post->ID, 'question', true ); $answer = get_post_meta( $post->ID, 'answer', true );You need to upodate the
questionin:$post->ID, 'question', trueto match your field names, and the same for theanswerThis way you only have to add the Question and Answer to your custom field, and the rest can be done automatically.
Hi David,
this sounds like a great approach. Many thanks for laying this out.
I’ll add another Custom Field to the CPT and then let you know how it went.
In the meantime, let’s assume this works for the FAQ related JSON. I’m planning to apply the same approach to a how-to JSON also. In this case would you recommend me extending the same CPT with another set of Custom Fields or rather create a new CPT for how-tos (and why)?
FYI: Currently, I’m using a Custom Field to determine the Type of “JSON” that is required.
Best,
JanThats hard for me to answer, as one multipurpose CPT vs many specific CPTs will come down to how you intend to use them.
My initial stance would be to create a new CPT.
It keeps things simple, you don’t have to do anything fancy for standard things, like archive pages of just How To’s or search just that post type, or making changes to it single template.I would change my stance if there was a need to related the content or create a hierarchical structure eg. Parent ( FAQ ) -> Child ( How To ).
Hi David,
many thanks for your answer regarding multipurpose CPTs. Happy to follow your advise and keep things simple in the first FAQ version.
Meanwhile, I also managed to update your PHP snippet. The CPT is
wg_seo_chatand the custom field for the question iswg_chat_options_question. In the current design the answer does not have a custom field but uses thepost contentstandard field.add_action( 'wp_head', 'db_print_faq_json', 99 ); function db_print_faq_json() { // Check if its a single post if ( is_wg_seo_chat() ) { // Get Custom field: question and answer global $post; $question = get_post_meta( $wg_chat_options_question->ID, 'question', true ); $answer = get_post_meta( $post->ID, 'answer', true ); // if both question and answer are present print JSON if ( $question && $answer ) { printf(' <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "%1$s", "acceptedAnswer": { "@type": "Answer", "text": "%2$s" } } ] } </script>', $question, $answer ); } } }Is that how you would add it to the function.php?
Thanks,
Jan-
This reply was modified 3 years, 9 months ago by
Jan.
Hi Jan
Couple of things:
1. The template condition ie.
if ( is_wg_seo_chat() ) {Unless you have a custom function called
is_wg_seo_chat()you should change that to:if ( is_single() && is_post_type('wg_seo_chat') ){2. Getting the question from post meta:
if
wg_chat_options_questionis the custom field ( meta key name ). Then this:$question = get_post_meta( $wg_chat_options_question->ID, 'question', true );should be:
$question = get_post_meta( $post->ID, 'wg_chat_options_question', true );More info on the
get_post_metafunction and its args here:https://developer.ww.wp.xz.cn/reference/functions/get_post_meta/
-
This reply was modified 3 years, 9 months ago by
David.
Hi David,
many thanks for providing this helpful push.
To keep thinks simple, I have created two custom fields, one for the question and one for the answer ;-). The PHP now looks as follows:
// Support Chat - FAQ header inject add_action( 'wp_head', 'db_print_faq_json', 99 ); function db_print_faq_json() { // Check if its a single post if ( is_single() && is_post_type('wg_seo_chat') ){ // Get Custom field: question and answer global $post; $question = get_post_meta( $post->ID, 'wg_chat_options_question', true ); $answer = get_post_meta( $post->ID, 'wg_chat_options_answer', true ); // if both question and answer are present print JSON if ( $question && $answer ) { printf(' <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "%1$s", "acceptedAnswer": { "@type": "Answer", "text": "%2$s" } } ] } </script>', $question, $answer ); } } }Unfortunately the desired page is not loading when include the PHP into the function php. The WP debug log shows the the following error.
Please let me know how to correct the error in line 114
if ( is_single() && is_post_type('wg_seo_chat') ){Many thanks in advance.
Best,
JanPS: Link to relevant page
Doh, change:
if ( is_single() && is_post_type('wg_seo_chat') ){to:
if ( is_singular( 'wg_seo_chat' ) ) {Hi David,
many thanks for your quick reply.
This fix did the trick. You made my day!
As you can see from the screenshot, the text from both question and answer fall in place nicely.
Best,
JanGlad to be of help!
I really do not understand this tutorial š
I want FAQ on my post with generate blocks or without a plugin. I fix the schema FAQ with a custom field, but I want to show the FAQ in my posts.
-
This reply was modified 3 years, 9 months ago by
The topic ‘GP Blocks / structured data / faq’ is closed to new replies.