| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- <?php
- /**
- * WPSEO plugin file.
- *
- * @package WPSEO\Frontend
- */
- /**
- * Class WPSEO_JSON_LD
- *
- * Outputs schema code specific for Google's JSON LD stuff.
- *
- * @since 1.8
- */
- class WPSEO_JSON_LD implements WPSEO_WordPress_Integration {
- /**
- * @var array Holds the social profiles for the entity
- */
- private $profiles = array();
- /**
- * @var array Holds the data to put out
- */
- private $data = array();
- /**
- * Registers the hooks.
- */
- public function register_hooks() {
- add_action( 'wpseo_head', array( $this, 'json_ld' ), 90 );
- add_action( 'wpseo_json_ld', array( $this, 'website' ), 10 );
- add_action( 'wpseo_json_ld', array( $this, 'organization_or_person' ), 20 );
- add_action( 'wpseo_json_ld', array( $this, 'breadcrumb' ), 20 );
- }
- /**
- * JSON LD output function that the functions for specific code can hook into.
- *
- * @since 1.8
- */
- public function json_ld() {
- do_action( 'wpseo_json_ld' );
- }
- /**
- * Outputs code to allow Google to recognize social profiles for use in the Knowledge graph.
- *
- * @since 1.8
- */
- public function organization_or_person() {
- $company_or_person = WPSEO_Options::get( 'company_or_person', '' );
- if ( '' === $company_or_person ) {
- return;
- }
- $this->prepare_organization_person_markup();
- switch ( $company_or_person ) {
- case 'company':
- $this->organization();
- break;
- case 'person':
- $this->person();
- break;
- }
- $this->output( $company_or_person );
- }
- /**
- * Outputs code to allow recognition of the internal search engine.
- *
- * @since 1.5.7
- *
- * @link https://developers.google.com/structured-data/site-name
- */
- public function website() {
- if ( ! is_front_page() ) {
- return;
- }
- $this->data = array(
- '@context' => 'https://schema.org',
- '@type' => 'WebSite',
- '@id' => '#website',
- 'url' => $this->get_home_url(),
- 'name' => $this->get_website_name(),
- );
- $this->add_alternate_name();
- $this->internal_search_section();
- $this->output( 'website' );
- }
- /**
- * Outputs code to allow recognition of page's position in the site hierarchy
- *
- * @Link https://developers.google.com/search/docs/data-types/breadcrumb
- *
- * @return void
- */
- public function breadcrumb() {
- if ( is_front_page() || ! WPSEO_Options::get( 'breadcrumbs-enable', false ) ) {
- return;
- }
- $this->data = array(
- '@context' => 'https://schema.org',
- '@type' => 'BreadcrumbList',
- 'itemListElement' => array(),
- );
- $breadcrumbs_instance = WPSEO_Breadcrumbs::get_instance();
- $breadcrumbs = $breadcrumbs_instance->get_links();
- $broken = false;
- foreach ( $breadcrumbs as $index => $breadcrumb ) {
- if ( ! array_key_exists( 'url', $breadcrumb ) || ! array_key_exists( 'text', $breadcrumb ) ) {
- $broken = true;
- break;
- }
- $this->data['itemListElement'][] = array(
- '@type' => 'ListItem',
- 'position' => ( $index + 1 ),
- 'item' => array(
- '@id' => $breadcrumb['url'],
- 'name' => $breadcrumb['text'],
- ),
- );
- }
- // Only output if JSON is correctly formatted.
- if ( ! $broken ) {
- $this->output( 'breadcrumb' );
- }
- }
- /**
- * Outputs the JSON LD code in a valid JSON+LD wrapper.
- *
- * @since 1.8
- *
- * @param string $context The context of the output, useful for filtering.
- */
- private function output( $context ) {
- /**
- * Filter: 'wpseo_json_ld_output' - Allows filtering of the JSON+LD output.
- *
- * @api array $output The output array, before its JSON encoded.
- *
- * @param string $context The context of the output, useful to determine whether to filter or not.
- */
- $this->data = apply_filters( 'wpseo_json_ld_output', $this->data, $context );
- if ( is_array( $this->data ) && ! empty( $this->data ) ) {
- echo "<script type='application/ld+json'>", wp_json_encode( $this->data ), '</script>', "\n";
- }
- // Empty the $data array so we don't output it twice.
- $this->data = array();
- }
- /**
- * Schema for Organization.
- */
- private function organization() {
- if ( '' !== WPSEO_Options::get( 'company_name', '' ) ) {
- $this->data['@type'] = 'Organization';
- $this->data['@id'] = $this->get_home_url() . '#organization';
- $this->data['name'] = WPSEO_Options::get( 'company_name' );
- $this->data['logo'] = WPSEO_Options::get( 'company_logo', '' );
- return;
- }
- $this->data = false;
- }
- /**
- * Schema for Person.
- */
- private function person() {
- if ( '' !== WPSEO_Options::get( 'person_name', '' ) ) {
- $this->data['@type'] = 'Person';
- $this->data['@id'] = '#person';
- $this->data['name'] = WPSEO_Options::get( 'person_name' );
- return;
- }
- $this->data = false;
- }
- /**
- * Prepares the organization or person markup.
- */
- private function prepare_organization_person_markup() {
- $this->fetch_social_profiles();
- $this->data = array(
- '@context' => 'https://schema.org',
- '@type' => '',
- 'url' => $this->get_home_url(),
- 'sameAs' => $this->profiles,
- );
- }
- /**
- * Retrieve the social profiles to display in the organization output.
- *
- * @since 1.8
- *
- * @link https://developers.google.com/webmasters/structured-data/customize/social-profiles
- */
- private function fetch_social_profiles() {
- $social_profiles = array(
- 'facebook_site',
- 'instagram_url',
- 'linkedin_url',
- 'plus-publisher',
- 'myspace_url',
- 'youtube_url',
- 'pinterest_url',
- );
- foreach ( $social_profiles as $profile ) {
- if ( WPSEO_Options::get( $profile, '' ) !== '' ) {
- $this->profiles[] = WPSEO_Options::get( $profile );
- }
- }
- if ( WPSEO_Options::get( 'twitter_site', '' ) !== '' ) {
- $this->profiles[] = 'https://twitter.com/' . WPSEO_Options::get( 'twitter_site' );
- }
- }
- /**
- * Retrieves the home URL.
- *
- * @return string
- */
- private function get_home_url() {
- /**
- * Filter: 'wpseo_json_home_url' - Allows filtering of the home URL for Yoast SEO's JSON+LD output.
- *
- * @api unsigned string
- */
- return apply_filters( 'wpseo_json_home_url', WPSEO_Utils::home_url() );
- }
- /**
- * Returns an alternate name if one was specified in the Yoast SEO settings.
- */
- private function add_alternate_name() {
- if ( '' !== WPSEO_Options::get( 'alternate_website_name', '' ) ) {
- $this->data['alternateName'] = WPSEO_Options::get( 'alternate_website_name' );
- }
- }
- /**
- * Adds the internal search JSON LD code to the homepage if it's not disabled.
- *
- * @link https://developers.google.com/structured-data/slsb-overview
- *
- * @return void
- */
- private function internal_search_section() {
- /**
- * Filter: 'disable_wpseo_json_ld_search' - Allow disabling of the json+ld output.
- *
- * @api bool $display_search Whether or not to display json+ld search on the frontend.
- */
- if ( ! apply_filters( 'disable_wpseo_json_ld_search', false ) ) {
- /**
- * Filter: 'wpseo_json_ld_search_url' - Allows filtering of the search URL for Yoast SEO.
- *
- * @api string $search_url The search URL for this site with a `{search_term_string}` variable.
- */
- $search_url = apply_filters( 'wpseo_json_ld_search_url', $this->get_home_url() . '?s={search_term_string}' );
- $this->data['potentialAction'] = array(
- '@type' => 'SearchAction',
- 'target' => $search_url,
- 'query-input' => 'required name=search_term_string',
- );
- }
- }
- /**
- * Returns the website name either from Yoast SEO's options or from the site settings.
- *
- * @since 2.1
- *
- * @return string
- */
- private function get_website_name() {
- if ( '' !== WPSEO_Options::get( 'website_name', '' ) ) {
- return WPSEO_Options::get( 'website_name' );
- }
- return get_bloginfo( 'name' );
- }
- }
|