Compat: only disable Jetpack's image CDN via filter

This follows the discussion in #307.

1. Do not disable Jetpack's image CDN in ActivityPub requests by default.
2. Add a new filter, activitypub_images_use_jetpack_image_cdn, that site owners can use to disable Jetpack's Image CDN if they'd like to.
3. Extract image getting into its own method for improved readability.
This commit is contained in:
Jeremy Herve 2023-04-25 10:54:21 +02:00
parent 475f4aaea0
commit da63763ddc
No known key found for this signature in database
GPG key ID: EF65CC7D9AC11920

View file

@ -305,41 +305,16 @@ class Post {
// get URLs for each image // get URLs for each image
foreach ( $image_ids as $id ) { foreach ( $image_ids as $id ) {
$alt = \get_post_meta( $id, '_wp_attachment_image_alt', true ); $thumbnail = $this->get_image( $id );
/**
* If you use the Jetpack plugin and its Image CDN, aka Photon,
* the image strings returned will use the Photon URL.
* We don't want that since Fediverse instances already do caching on their end.
* Let the CDN only be used for visitors of the site.
*
* Old versions of Jetpack used the Jetpack_Photon class to do this.
* New versions use the Image_CDN class.
* Let's handle both.
*/
if ( \class_exists( '\Automattic\Jetpack\Image_CDN\Image_CDN' ) ) {
\remove_filter( 'image_downsize', array( \Automattic\Jetpack\Image_CDN\Image_CDN::instance(), 'filter_image_downsize' ) );
} elseif ( \class_exists( 'Jetpack_Photon' ) ) {
\remove_filter( 'image_downsize', array( \Jetpack_Photon::instance(), 'filter_image_downsize' ) );
}
$thumbnail = \wp_get_attachment_image_src( $id, 'full' );
// Re-enable Photon now that the image URL has been built.
if ( \class_exists( '\Automattic\Jetpack\Image_CDN\Image_CDN' ) ) {
\add_filter( 'image_downsize', array( \Automattic\Jetpack\Image_CDN\Image_CDN::instance(), 'filter_image_downsize' ), 10, 3 );
} elseif ( \class_exists( 'Jetpack_Photon' ) ) {
\add_filter( 'image_downsize', array( \Jetpack_Photon::instance(), 'filter_image_downsize' ), 10, 3 );
}
$mimetype = \get_post_mime_type( $id );
if ( $thumbnail ) { if ( $thumbnail ) {
$image = array( $mimetype = \get_post_mime_type( $id );
'type' => 'Image', $alt = \get_post_meta( $id, '_wp_attachment_image_alt', true );
'url' => $thumbnail[0], $image = array(
'type' => 'Image',
'url' => $thumbnail[0],
'mediaType' => $mimetype, 'mediaType' => $mimetype,
); );
if ( $alt ) { if ( $alt ) {
$image['name'] = $alt; $image['name'] = $alt;
} }
@ -352,6 +327,54 @@ class Post {
return $images; return $images;
} }
/**
* Return details about an image attachment.
*
* Can return a CDNized URL if Jetpack's image CDN is active.
* This can be disabled with a filter.
*
* @param int $id The attachment ID.
*
* @return array|false Array of image data, or boolean false if no image is available.
*/
public function get_image( $id ) {
/**
* Allow bypassing Jetpack's Image CDN when returning image URLs.
*
* @param bool $should_use_cdn Whether to use the Jetpack Image CDN. True by default.
*/
$should_use_cdn = apply_filters( 'activitypub_images_use_jetpack_image_cdn', true );
if ( $should_use_cdn ) {
// Return the full URL, using a CDN URL if Jetpack's image CDN is active.
return \wp_get_attachment_image_src( $id, 'full' );
}
/*
* Disable Jetpacks image CDN image processing for this request.
*
* Note: old versions of Jetpack used the Jetpack_Photon class to do this.
* New versions use the Image_CDN class.
* Let's handle both.
*/
if ( \class_exists( '\Automattic\Jetpack\Image_CDN\Image_CDN' ) ) {
\remove_filter( 'image_downsize', array( \Automattic\Jetpack\Image_CDN\Image_CDN::instance(), 'filter_image_downsize' ) );
} elseif ( \class_exists( 'Jetpack_Photon' ) ) {
\remove_filter( 'image_downsize', array( \Jetpack_Photon::instance(), 'filter_image_downsize' ) );
}
$thumbnail = \wp_get_attachment_image_src( $id, 'full' );
// Re-enable Photon now that the image URL has been built.
if ( \class_exists( '\Automattic\Jetpack\Image_CDN\Image_CDN' ) ) {
\add_filter( 'image_downsize', array( \Automattic\Jetpack\Image_CDN\Image_CDN::instance(), 'filter_image_downsize' ), 10, 3 );
} elseif ( \class_exists( 'Jetpack_Photon' ) ) {
\add_filter( 'image_downsize', array( \Jetpack_Photon::instance(), 'filter_image_downsize' ), 10, 3 );
}
return $thumbnail;
}
/** /**
* Returns a list of Tags, used in the Post * Returns a list of Tags, used in the Post
* *