You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.7 KiB

<?php
/**
* WPSEO plugin file.
*
* @package WPSEO\Frontend\Schema
*/
/**
* Returns schema Organization data.
*
* @since 10.2
*/
class WPSEO_Schema_Organization implements WPSEO_Graph_Piece {
/**
* A value object with context variables.
*
* @var WPSEO_Schema_Context
*/
private $context;
/**
* WPSEO_Schema_Organization constructor.
*
* @param WPSEO_Schema_Context $context A value object with context variables.
*/
public function __construct( WPSEO_Schema_Context $context ) {
$this->context = $context;
}
/**
* Determines whether an Organization graph piece should be added.
*
* @return bool
*/
public function is_needed() {
return ( $this->context->site_represents === 'company' );
}
/**
* Returns the Organization Schema data.
*
* @return array $data The Organization schema.
*/
public function generate() {
$data = array(
'@type' => 'Organization',
'@id' => $this->context->site_url . WPSEO_Schema_IDs::ORGANIZATION_HASH,
'name' => $this->context->company_name,
'url' => $this->context->site_url,
'sameAs' => $this->fetch_social_profiles(),
);
$data = $this->add_logo( $data );
return $data;
}
/**
* Adds a site's logo.
*
* @param array $data The Organization schema.
*
* @return array $data The Organization schema.
*/
private function add_logo( $data ) {
$schema_id = $this->context->site_url . WPSEO_Schema_IDs::ORGANIZATION_LOGO_HASH;
$schema_image = new WPSEO_Schema_Image( $schema_id );
$data['logo'] = $schema_image->generate_from_attachment_id( $this->context->company_logo_id, $this->context->company_name );
$data['image'] = array( '@id' => $schema_id );
return $data;
}
/**
* Retrieve the social profiles to display in the organization schema.
*
* @since 1.8
*
* @link https://developers.google.com/webmasters/structured-data/customize/social-profiles
*
* @return array $profiles An array of social profiles.
*/
private function fetch_social_profiles() {
$profiles = array();
$social_profiles = array(
'facebook_site',
'instagram_url',
'linkedin_url',
'myspace_url',
'youtube_url',
'pinterest_url',
'wikipedia_url',
);
foreach ( $social_profiles as $profile ) {
if ( WPSEO_Options::get( $profile, '' ) !== '' ) {
$profiles[] = WPSEO_Options::get( $profile );
}
}
if ( WPSEO_Options::get( 'twitter_site', '' ) !== '' ) {
$profiles[] = 'https://twitter.com/' . WPSEO_Options::get( 'twitter_site' );
}
/**
* Filter: 'wpseo_schema_organization_social_profiles' - Allows filtering social profiles for the
* represented organization.
*
* @api string[] $profiles
*/
$profiles = apply_filters( 'wpseo_schema_organization_social_profiles', $profiles );
return $profiles;
}
}