ldc-sbv/pole-sbv-content/plugins/wordpress-seo/frontend/class-opengraph-image.php
2018-04-16 15:29:38 +02:00

322 lines
7.4 KiB
PHP

<?php
/**
* WPSEO plugin file.
*
* @package WPSEO\Frontend
*/
/**
* Class WPSEO_OpenGraph_Image
*/
class WPSEO_OpenGraph_Image {
/**
* @var array $images Holds the images that have been put out as OG image.
*/
private $images = array();
/**
* @todo This needs to be refactored since we only hold one set of dimensions for multiple images. R.
* @var array $dimensions Holds image dimensions, if determined.
*/
protected $dimensions = array();
/**
* Constructor.
*
* @param string|boolean $image Optional image URL.
*/
public function __construct( $image = false ) {
// If an image was not supplied or could not be added.
if ( empty( $image ) || ! $this->add_image( $image ) ) {
$this->set_images();
}
}
/**
* Return the images array.
*
* @return array
*/
public function get_images() {
return $this->images;
}
/**
* Return the dimensions array.
*
* @return array
*/
public function get_dimensions() {
return $this->dimensions;
}
/**
* Display an OpenGraph image tag.
*
* @param string $img Source URL to the image.
*
* @return bool
*/
public function add_image( $img ) {
$original = trim( $img );
// Filter: 'wpseo_opengraph_image' - Allow changing the OpenGraph image.
$img = trim( apply_filters( 'wpseo_opengraph_image', $img ) );
if ( $original !== $img ) {
$this->dimensions = array();
}
if ( empty( $img ) ) {
return false;
}
if ( WPSEO_Utils::is_url_relative( $img ) === true ) {
$img = $this->get_relative_path( $img );
}
if ( in_array( $img, $this->images, true ) ) {
return false;
}
array_push( $this->images, $img );
return true;
}
/**
* Check if page is front page or singular and call the corresponding functions. If not, call get_default_image.
*/
private function set_images() {
/**
* Filter: wpseo_add_opengraph_images - Allow developers to add images to the OpenGraph tags.
*
* @api WPSEO_OpenGraph_Image The current object.
*/
do_action( 'wpseo_add_opengraph_images', $this );
if ( is_front_page() ) {
$this->get_front_page_image();
}
elseif ( is_home() ) { // Posts page, which won't be caught by is_singular() below.
$this->get_posts_page_image();
}
$frontend_page_type = new WPSEO_Frontend_Page_Type();
if ( $frontend_page_type->is_simple_page() ) {
$this->get_singular_image( $frontend_page_type->get_simple_page_id() );
}
if ( is_category() || is_tax() || is_tag() ) {
$this->get_opengraph_image_taxonomy();
}
/**
* Filter: wpseo_add_opengraph_additional_images - Allows to add additional images to the OpenGraph tags.
*
* @api WPSEO_OpenGraph_Image The current object.
*/
do_action( 'wpseo_add_opengraph_additional_images', $this );
$this->get_default_image();
}
/**
* If the frontpage image exists, call add_image.
*/
private function get_front_page_image() {
if ( WPSEO_Options::get( 'og_frontpage_image', '' ) !== '' ) {
$this->add_image( WPSEO_Options::get( 'og_frontpage_image' ) );
}
}
/**
* Get the images of the posts page.
*/
private function get_posts_page_image() {
$post_id = get_option( 'page_for_posts' );
if ( $this->get_opengraph_image_post( $post_id ) ) {
return;
}
if ( $this->get_featured_image( $post_id ) ) {
return;
}
}
/**
* Get the images of the singular post.
*
* @param null|int $post_id The post id to get the images for.
*/
private function get_singular_image( $post_id = null ) {
if ( $post_id === null ) {
$post_id = get_the_ID();
}
if ( $this->get_opengraph_image_post( $post_id ) ) {
return;
}
if ( $this->get_attachment_page_image( $post_id ) ) {
return;
}
if ( $this->get_featured_image( $post_id ) ) {
return;
}
$this->get_content_images( get_post( $post_id ) );
}
/**
* Get default image and call add_image.
*/
private function get_default_image() {
if ( count( $this->images ) === 0 && WPSEO_Options::get( 'og_default_image', '' ) !== '' ) {
$this->add_image( WPSEO_Options::get( 'og_default_image' ) );
}
}
/**
* If opengraph-image is set, call add_image and return true.
*
* @param int $post_id Optional post ID to use.
*
* @return bool
*/
private function get_opengraph_image_post( $post_id = 0 ) {
$ogimg = WPSEO_Meta::get_value( 'opengraph-image', $post_id );
if ( $ogimg !== '' ) {
$this->add_image( $ogimg );
return true;
}
return false;
}
/**
* Check if taxonomy has an image and add this image.
*/
private function get_opengraph_image_taxonomy() {
$ogimg = WPSEO_Taxonomy_Meta::get_meta_without_term( 'opengraph-image' );
if ( $ogimg !== '' ) {
$this->add_image( $ogimg );
}
}
/**
* If there is a featured image, check image size. If image size is correct, call add_image and return true.
*
* @param int $post_id The post ID.
*
* @return bool
*/
private function get_featured_image( $post_id ) {
if ( has_post_thumbnail( $post_id ) ) {
/**
* Filter: 'wpseo_opengraph_image_size' - Allow changing the image size used for OpenGraph sharing.
*
* @api string $unsigned Size string.
*/
$thumb = wp_get_attachment_image_src( get_post_thumbnail_id( $post_id ), apply_filters( 'wpseo_opengraph_image_size', 'original' ) );
if ( $this->check_featured_image_size( $thumb ) ) {
$this->dimensions['width'] = $thumb[1];
$this->dimensions['height'] = $thumb[2];
return $this->add_image( $thumb[0] );
}
}
return false;
}
/**
* If this is an attachment page, call add_image with the attachment and return true.
*
* @param int $post_id The post ID.
*
* @return bool
*/
private function get_attachment_page_image( $post_id ) {
if ( get_post_type( $post_id ) === 'attachment' ) {
$mime_type = get_post_mime_type( $post_id );
switch ( $mime_type ) {
case 'image/jpeg':
case 'image/png':
case 'image/gif':
return $this->add_image( wp_get_attachment_url( $post_id ) );
}
}
return false;
}
/**
* Filter: 'wpseo_pre_analysis_post_content' - Allow filtering the content before analysis.
*
* @api string $post_content The Post content string.
*
* @param object $post The post object.
*/
private function get_content_images( $post ) {
$content = apply_filters( 'wpseo_pre_analysis_post_content', $post->post_content, $post );
if ( preg_match_all( '`<img [^>]+>`', $content, $matches ) ) {
foreach ( $matches[0] as $img ) {
if ( preg_match( '`src=(["\'])(.*?)\1`', $img, $match ) ) {
$this->add_image( $match[2] );
}
}
}
}
/**
* Check size of featured image. If image is too small, return false, else return true.
*
* @param array $img_data Image info from wp_get_attachment_image_src: url, width, height, icon.
*
* @return bool
*/
private function check_featured_image_size( $img_data ) {
if ( ! is_array( $img_data ) ) {
return false;
}
// Get the width and height of the image.
if ( $img_data[1] < 200 || $img_data[2] < 200 ) {
return false;
}
return true;
}
/**
* Get the relative path of the image.
*
* @param array $img Image data array.
*
* @return bool|string
*/
private function get_relative_path( $img ) {
if ( $img[0] !== '/' ) {
return false;
}
// If it's a relative URL, it's relative to the domain, not necessarily to the WordPress install, we
// want to preserve domain name and URL scheme (http / https) though.
$parsed_url = wp_parse_url( home_url() );
$img = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $img;
return $img;
}
}