Schema Markup for Display Posts Shortcode

<?php

/**
 * Schema Markup for Display Posts Shortcode
 * @author Bill Erickson
 * @link https://www.billerickson.net/code/schema-markup-display-posts-shortcode
 *
 * @param string $open_markup
 * @param array $atts, shortcode attributes
 * @param object $loop
 * @return string
 */
function ea_dps_schema( $open_markup, $atts, $loop ) {
	if( !empty( $atts['disable_schema'] ) && true === filter_var( $atts['disable_schema'], FILTER_VALIDATE_BOOLEAN ) )
		return $open_markup;
	
	$json = ea_json_summary_markup( $loop );
	return $json . $open_markup;
}
add_filter( 'display_posts_shortcode_wrapper_open', 'ea_dps_schema', 40, 3 );

/**
 * JSON Summary Markup
 * @link https://developers.google.com/search/docs/guides/mark-up-listings#summary-page--multiple-full-details-pages
 *
 */
function ea_json_summary_markup( $loop = false ) {
	global $wp_query;
	$loop = empty( $loop ) ? $wp_query : $loop;

	if( ! $loop->have_posts() )
		return;

	$output = array();
	foreach( $loop->posts as $i => $post ) {
		$position = $i + 1;
		$output [] = '{
		      "@type":"ListItem",
		      "position":' . $position . ',
		      "url":"' . get_permalink( $post->ID ) . '"
		  }';
	}

	return '<script type="application/ld+json">
	{
	  "@context":"http://schema.org",
	  "@type":"ItemList",
	  "itemListElement":[' . join( ',', $output ) . ']
	}
	</script>';
}

Display Posts Shortcode

Bill Erickson

Bill Erickson is a freelance WordPress developer and a contributing developer to the Genesis framework. For the past 14 years he has worked with attorneys, publishers, corporations, and non-profits, building custom websites tailored to their needs and goals.

Ready to upgrade your website?

I build custom WordPress websites that look great and are easy to manage.

Let's Talk