You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.5 KiB
PHP
134 lines
3.5 KiB
PHP
<?php
|
|
/**
|
|
* The Author Class.
|
|
*
|
|
* @since 1.0.13
|
|
* @package RankMath
|
|
* @subpackage RankMath\Schema
|
|
* @author Rank Math <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Schema;
|
|
|
|
use RankMath\Helper;
|
|
use RankMath\User;
|
|
use RankMath\Paper\Paper;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Author class.
|
|
*/
|
|
class Author implements Snippet {
|
|
|
|
/**
|
|
* Add Author entity in JSON-LD data.
|
|
*
|
|
* @link https://schema.org/Person
|
|
*
|
|
* @param array $data Array of JSON-LD data.
|
|
* @param JsonLD $jsonld JsonLD Instance.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function process( $data, $jsonld ) {
|
|
$is_archive_disabled = Helper::get_settings( 'titles.disable_author_archives' );
|
|
$author_id = is_singular() ? $jsonld->post->post_author : get_the_author_meta( 'ID' );
|
|
$author_name = get_the_author();
|
|
$author_url = get_author_posts_url( $author_id );
|
|
$data['ProfilePage'] = [
|
|
'@type' => 'Person',
|
|
'@id' => ! $is_archive_disabled ? $author_url : $jsonld->parts['url'] . '#author',
|
|
'name' => $author_name,
|
|
'description' => wp_strip_all_tags( stripslashes( $this->get_description( $author_id ) ), true ),
|
|
'url' => $is_archive_disabled ? '' : $author_url,
|
|
];
|
|
|
|
$this->add_image( $data['ProfilePage'], $author_id, $jsonld );
|
|
$this->add_same_as( $data['ProfilePage'], $author_id );
|
|
$this->add_works_for( $data['ProfilePage'], $data );
|
|
|
|
if ( is_author() && ! empty( $data['WebPage'] ) ) {
|
|
$data['ProfilePage']['mainEntityOfPage'] = [
|
|
'@id' => $data['WebPage']['@id'],
|
|
];
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Add sameAs property to the Person entity.
|
|
*
|
|
* @param array $entity Author schema data.
|
|
* @param int $author_id Author ID.
|
|
*/
|
|
private function add_same_as( &$entity, $author_id ) {
|
|
$same_as = [
|
|
get_the_author_meta( 'user_url', $author_id ),
|
|
get_user_meta( $author_id, 'facebook', true ),
|
|
];
|
|
|
|
if ( $twitter = get_user_meta( $author_id, 'twitter', true ) ) { // phpcs:ignore
|
|
$same_as[] = 'https://twitter.com/' . $twitter;
|
|
}
|
|
|
|
$addional_urls = get_user_meta( $author_id, 'additional_profile_urls', true );
|
|
if ( $addional_urls ) {
|
|
$same_as = array_merge( $same_as, explode( ' ', $addional_urls ) );
|
|
}
|
|
|
|
$same_as = array_filter( $same_as );
|
|
if ( empty( $same_as ) ) {
|
|
return;
|
|
}
|
|
|
|
$entity['sameAs'] = array_values( $same_as );
|
|
}
|
|
|
|
/**
|
|
* Add image property to the Person entity.
|
|
*
|
|
* @param array $entity Author schema data.
|
|
* @param int $author_id Author ID.
|
|
* @param JsonLD $jsonld JsonLD Instance.
|
|
*/
|
|
private function add_image( &$entity, $author_id, $jsonld ) {
|
|
$entity['image'] = [
|
|
'@type' => 'ImageObject',
|
|
'@id' => get_avatar_url( $author_id ),
|
|
'url' => get_avatar_url( $author_id ),
|
|
'caption' => get_the_author(),
|
|
];
|
|
|
|
$jsonld->add_prop( 'language', $entity['image'] );
|
|
}
|
|
|
|
/**
|
|
* Add worksFor property referencing it to the publisher entity.
|
|
*
|
|
* @param array $entity Author schema data.
|
|
* @param array $data Schema Data.
|
|
*/
|
|
private function add_works_for( &$entity, $data ) {
|
|
if (
|
|
empty( $data['publisher'] ) ||
|
|
in_array( 'Person', (array) $data['publisher']['@type'], true )
|
|
) {
|
|
return;
|
|
}
|
|
|
|
$entity['worksFor'] = [ '@id' => $data['publisher']['@id'] ];
|
|
}
|
|
|
|
/**
|
|
* Get author description.
|
|
*
|
|
* @param int $author_id Author ID.
|
|
*/
|
|
private function get_description( $author_id ) {
|
|
$description = User::get_meta( 'description', $author_id );
|
|
return $description ? $description : Paper::get_from_options( 'author_archive_description' );
|
|
}
|
|
}
|