112 lines
2.6 KiB
PHP
112 lines
2.6 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* WPSEO plugin file.
|
||
|
*
|
||
|
* @package WPSEO
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* WPSEO_Content_Images.
|
||
|
*/
|
||
|
class WPSEO_Content_Images {
|
||
|
|
||
|
/**
|
||
|
* Retrieves images from the post content.
|
||
|
*
|
||
|
* @param int $post_id The post ID.
|
||
|
* @param \WP_Post|null $post The post object.
|
||
|
*
|
||
|
* @return array An array of images found in this post.
|
||
|
*/
|
||
|
public function get_images( $post_id, $post = null ) {
|
||
|
return $this->get_images_from_content( $this->get_post_content( $post_id, $post ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Grabs the images from the content.
|
||
|
*
|
||
|
* @param string $content The post content string.
|
||
|
*
|
||
|
* @return array An array of image URLs.
|
||
|
*/
|
||
|
public function get_images_from_content( $content ) {
|
||
|
if ( ! is_string( $content ) ) {
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
$content_images = $this->get_img_tags_from_content( $content );
|
||
|
$images = array_map( [ $this, 'get_img_tag_source' ], $content_images );
|
||
|
$images = array_filter( $images );
|
||
|
$images = array_unique( $images );
|
||
|
$images = array_values( $images ); // Reset the array keys.
|
||
|
|
||
|
return $images;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the image tags from a given content string.
|
||
|
*
|
||
|
* @param string $content The content to search for image tags.
|
||
|
*
|
||
|
* @return array An array of `<img>` tags.
|
||
|
*/
|
||
|
private function get_img_tags_from_content( $content ) {
|
||
|
if ( strpos( $content, '<img' ) === false ) {
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
preg_match_all( '`<img [^>]+>`', $content, $matches );
|
||
|
if ( isset( $matches[0] ) ) {
|
||
|
return $matches[0];
|
||
|
}
|
||
|
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retrieves the image URL from an image tag.
|
||
|
*
|
||
|
* @param string $image Image HTML element.
|
||
|
*
|
||
|
* @return string|bool The image URL on success, false on failure.
|
||
|
*/
|
||
|
private function get_img_tag_source( $image ) {
|
||
|
preg_match( '`src=(["\'])(.*?)\1`', $image, $matches );
|
||
|
if ( isset( $matches[2] ) && filter_var( $matches[2], FILTER_VALIDATE_URL ) ) {
|
||
|
return $matches[2];
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retrieves the post content we want to work with.
|
||
|
*
|
||
|
* @param int $post_id The post ID.
|
||
|
* @param WP_Post|array|null $post The post.
|
||
|
*
|
||
|
* @return string The content of the supplied post.
|
||
|
*/
|
||
|
private function get_post_content( $post_id, $post ) {
|
||
|
if ( $post === null ) {
|
||
|
$post = get_post( $post_id );
|
||
|
}
|
||
|
|
||
|
if ( $post === null ) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filter: 'wpseo_pre_analysis_post_content' - Allow filtering the content before analysis.
|
||
|
*
|
||
|
* @api string $post_content The Post content string.
|
||
|
*/
|
||
|
$content = apply_filters( 'wpseo_pre_analysis_post_content', $post->post_content, $post );
|
||
|
|
||
|
if ( ! is_string( $content ) ) {
|
||
|
$content = '';
|
||
|
}
|
||
|
|
||
|
return $content;
|
||
|
}
|
||
|
}
|