123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- <?php
- /**
- * WPSEO plugin file.
- *
- * @package WPSEO\Frontend\Schema
- */
- /**
- * Returns schema WebPage data.
- *
- * @since 10.2
- */
- class WPSEO_Schema_WebPage implements WPSEO_Graph_Piece {
- /**
- * The date helper.
- *
- * @var WPSEO_Date_Helper
- */
- protected $date;
- /**
- * A value object with context variables.
- *
- * @var WPSEO_Schema_Context
- */
- private $context;
- /**
- * WPSEO_Schema_WebPage constructor.
- *
- * @param WPSEO_Schema_Context $context A value object with context variables.
- */
- public function __construct( WPSEO_Schema_Context $context ) {
- $this->context = $context;
- $this->date = new WPSEO_Date_Helper();
- }
- /**
- * Determines whether or not a piece should be added to the graph.
- *
- * @return bool
- */
- public function is_needed() {
- if ( is_404() ) {
- return false;
- }
- return true;
- }
- /**
- * Returns WebPage schema data.
- *
- * @return array WebPage schema data.
- */
- public function generate() {
- $data = [
- '@type' => $this->determine_page_type(),
- '@id' => $this->context->canonical . WPSEO_Schema_IDs::WEBPAGE_HASH,
- 'url' => $this->context->canonical,
- 'inLanguage' => get_bloginfo( 'language' ),
- 'name' => $this->context->title,
- 'isPartOf' => [
- '@id' => $this->context->site_url . WPSEO_Schema_IDs::WEBSITE_HASH,
- ],
- ];
- if ( is_front_page() ) {
- if ( $this->context->site_represents_reference ) {
- $data['about'] = $this->context->site_represents_reference;
- }
- }
- if ( is_singular() ) {
- $this->add_image( $data );
- $post = get_post( $this->context->id );
- $data['datePublished'] = $this->date->format( $post->post_date_gmt );
- $data['dateModified'] = $this->date->format( $post->post_modified_gmt );
- if ( get_post_type( $post ) === 'post' ) {
- $data = $this->add_author( $data, $post );
- }
- }
- if ( ! empty( $this->context->description ) ) {
- $data['description'] = strip_tags( $this->context->description, '<h1><h2><h3><h4><h5><h6><br><ol><ul><li><a><p><b><strong><i><em>' );
- }
- if ( $this->add_breadcrumbs() ) {
- $data['breadcrumb'] = [
- '@id' => $this->context->canonical . WPSEO_Schema_IDs::BREADCRUMB_HASH,
- ];
- }
- return $data;
- }
- /**
- * Adds an author property to the $data if the WebPage is not represented.
- *
- * @param array $data The WebPage schema.
- * @param WP_Post $post The post the context is representing.
- *
- * @return array The WebPage schema.
- */
- public function add_author( $data, $post ) {
- if ( $this->context->site_represents === false ) {
- $data['author'] = [ '@id' => WPSEO_Schema_Utils::get_user_schema_id( $post->post_author, $this->context ) ];
- }
- return $data;
- }
- /**
- * If we have an image, make it the primary image of the page.
- *
- * @param array $data WebPage schema data.
- */
- public function add_image( &$data ) {
- if ( $this->context->has_image ) {
- $data['primaryImageOfPage'] = [ '@id' => $this->context->canonical . WPSEO_Schema_IDs::PRIMARY_IMAGE_HASH ];
- }
- }
- /**
- * Determine if we should add a breadcrumb attribute.
- *
- * @return bool
- */
- private function add_breadcrumbs() {
- if ( is_front_page() ) {
- return false;
- }
- if ( $this->context->breadcrumbs_enabled ) {
- return true;
- }
- return false;
- }
- /**
- * Determine the page type for the current page.
- *
- * @return string
- */
- private function determine_page_type() {
- switch ( true ) {
- case is_search():
- $type = 'SearchResultsPage';
- break;
- case is_author():
- $type = 'ProfilePage';
- break;
- case WPSEO_Frontend_Page_Type::is_posts_page():
- case WPSEO_Frontend_Page_Type::is_home_posts_page():
- case is_archive():
- $type = 'CollectionPage';
- break;
- default:
- $type = 'WebPage';
- }
- /**
- * Filter: 'wpseo_schema_webpage_type' - Allow changing the WebPage type.
- *
- * @api string $type The WebPage type.
- */
- return apply_filters( 'wpseo_schema_webpage_type', $type );
- }
- }
|