-
Notifications
You must be signed in to change notification settings - Fork 385
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use data-hero-candidate attribute in DetermineHeroImages #5934
Changes from 17 commits
8b84aaa
d727a36
77d5f99
c490443
48b9524
b126bc3
b685b0e
7d96d8a
cdaa8c4
223b008
3d6ff8b
e13d93d
1d99a1e
02d1b90
68b961c
025a6f0
b5e45f1
cadc98f
2cac676
834cca5
e42f1b3
8513aba
25ec074
65b0e05
bcb50e5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
<?php | ||
/** | ||
* Class Options. | ||
* | ||
* @package AmpProject\AmpWP | ||
*/ | ||
|
||
namespace AmpProject\AmpWP\Dom; | ||
|
||
use AmpProject\Dom\Document; | ||
|
||
interface Options { | ||
|
||
/** | ||
* Default options to use for the Dom. | ||
* | ||
* @var array | ||
*/ | ||
const DEFAULTS = [ | ||
Document\Option::AMP_BIND_SYNTAX => Document\Option::AMP_BIND_SYNTAX_DATA_ATTRIBUTE, | ||
]; | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -31,25 +31,25 @@ | |||||||||||||||||||||||||||||||||
final class DetermineHeroImages implements Transformer { | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||
* XPath query to find the existing hero images (elements with data/hero attribute). | ||||||||||||||||||||||||||||||||||
* XPath query to find the custom logo. | ||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||
* @var string | ||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||
const EXISTING_HERO_IMAGES_XPATH_QUERY = './/*[@data-hero]'; | ||||||||||||||||||||||||||||||||||
const CUSTOM_HEADER_XPATH_QUERY = ".//*[ @id = 'wp-custom-header' or @id = 'masthead' or @id = 'site-header' or contains( concat( ' ', normalize-space( @class ), ' ' ), ' wp-custom-header ' ) ]//*[ ( self::img or self::amp-img ) and not( @data-hero ) and not( contains( concat( ' ', normalize-space( @class ), ' ' ), ' custom-logo ' ) ) ]"; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||
* XPath query to find the custom logo. | ||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||
* @var string | ||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||
const CUSTOM_LOGO_XPATH_QUERY = ".//a[ contains( concat( ' ', normalize-space( @class ), ' ' ), ' custom-logo-link ' ) ]//*[ contains( concat( ' ', normalize-space( @class ), ' ' ), ' custom-logo ' ) ][ not( @data-hero ) ]"; | ||||||||||||||||||||||||||||||||||
const CUSTOM_LOGO_XPATH_QUERY = ".//a[ contains( concat( ' ', normalize-space( @class ), ' ' ), ' custom-logo-link ' ) ]//*[ ( self::img or self::amp-img ) and contains( concat( ' ', normalize-space( @class ), ' ' ), ' custom-logo ' ) ][ not( @data-hero ) ]"; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||
* XPath query to find the featured image. | ||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||
* @var string | ||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||
const FEATURED_IMAGE_XPATH_QUERY = ".//*[ contains( concat( ' ', normalize-space( @class ), ' ' ), ' wp-post-image ' ) ][ not( @data-hero ) ]"; | ||||||||||||||||||||||||||||||||||
const FEATURED_IMAGE_XPATH_QUERY = ".//*[ ( self::img or self::amp-img ) and contains( concat( ' ', normalize-space( @class ), ' ' ), ' wp-post-image ' ) ][ not( @data-hero ) ]"; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||
* XPath query to find the cover blocks. | ||||||||||||||||||||||||||||||||||
|
@@ -68,44 +68,60 @@ final class DetermineHeroImages implements Transformer { | |||||||||||||||||||||||||||||||||
* @return void | ||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||
public function transform( Document $document, ErrorCollection $errors ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable | ||||||||||||||||||||||||||||||||||
$existing_hero_images_count = $document->xpath->query( | ||||||||||||||||||||||||||||||||||
self::EXISTING_HERO_IMAGES_XPATH_QUERY, | ||||||||||||||||||||||||||||||||||
$document->body | ||||||||||||||||||||||||||||||||||
)->length; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
$available_hero_image_slots = max( | ||||||||||||||||||||||||||||||||||
PreloadHeroImage::DATA_HERO_MAX - $existing_hero_images_count, | ||||||||||||||||||||||||||||||||||
0 | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
$hero_image_elements = []; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if ( count( $hero_image_elements ) < $available_hero_image_slots ) { | ||||||||||||||||||||||||||||||||||
$custom_logo = $this->get_custom_logo( $document ); | ||||||||||||||||||||||||||||||||||
if ( null !== $custom_logo ) { | ||||||||||||||||||||||||||||||||||
$hero_image_elements[] = $custom_logo; | ||||||||||||||||||||||||||||||||||
foreach ( [ 'custom_header', 'custom_logo', 'featured_image', 'cover_blocks' ] as $hero_image_source ) { | ||||||||||||||||||||||||||||||||||
if ( count( $hero_image_elements ) < PreloadHeroImage::DATA_HERO_MAX ) { | ||||||||||||||||||||||||||||||||||
$candidates = []; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
switch ( $hero_image_source ) { | ||||||||||||||||||||||||||||||||||
case 'custom_header': | ||||||||||||||||||||||||||||||||||
$candidates = $this->get_custom_header( $document ); | ||||||||||||||||||||||||||||||||||
break; | ||||||||||||||||||||||||||||||||||
case 'custom_logo': | ||||||||||||||||||||||||||||||||||
$candidates = $this->get_custom_logo( $document ); | ||||||||||||||||||||||||||||||||||
break; | ||||||||||||||||||||||||||||||||||
case 'featured_image': | ||||||||||||||||||||||||||||||||||
$candidates = $this->get_featured_image( $document ); | ||||||||||||||||||||||||||||||||||
break; | ||||||||||||||||||||||||||||||||||
case 'cover_blocks': | ||||||||||||||||||||||||||||||||||
$candidates = $this->get_cover_blocks( $document ); | ||||||||||||||||||||||||||||||||||
break; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if ( empty( $candidates ) ) { | ||||||||||||||||||||||||||||||||||
continue; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if ( is_array( $candidates ) ) { | ||||||||||||||||||||||||||||||||||
$hero_image_elements = array_merge( $hero_image_elements, array_filter( $candidates ) ); | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
$hero_image_elements[] = $candidates; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if ( count( $hero_image_elements ) < $available_hero_image_slots ) { | ||||||||||||||||||||||||||||||||||
$featured_image = $this->get_featured_image( $document ); | ||||||||||||||||||||||||||||||||||
if ( null !== $featured_image ) { | ||||||||||||||||||||||||||||||||||
$hero_image_elements[] = $featured_image; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if ( count( $hero_image_elements ) < $available_hero_image_slots ) { | ||||||||||||||||||||||||||||||||||
$hero_image_elements = array_merge( | ||||||||||||||||||||||||||||||||||
$hero_image_elements, | ||||||||||||||||||||||||||||||||||
array_filter( | ||||||||||||||||||||||||||||||||||
$this->get_cover_blocks( $document ) | ||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
$this->add_data_hero_candidate_attribute( | ||||||||||||||||||||||||||||||||||
array_slice( $hero_image_elements, 0, PreloadHeroImage::DATA_HERO_MAX ) | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
$this->add_data_hero_attribute( | ||||||||||||||||||||||||||||||||||
array_slice( $hero_image_elements, 0, $available_hero_image_slots ) | ||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||
* Retrieve the element that represents the custom header. | ||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||
* @param Document $document Document to retrieve the custom header from. | ||||||||||||||||||||||||||||||||||
* @return DOMElement|null Element that represents the custom header, or null | ||||||||||||||||||||||||||||||||||
* if not found. | ||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||
private function get_custom_header( Document $document ) { | ||||||||||||||||||||||||||||||||||
$elements = $document->xpath->query( | ||||||||||||||||||||||||||||||||||
self::CUSTOM_HEADER_XPATH_QUERY, | ||||||||||||||||||||||||||||||||||
$document->body | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
Comment on lines
+130
to
133
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. An alternative way to identify the header image which may be more robust as opposed to relying on element IDs is to obtain the header image URL and then query for image elements that have that
Suggested change
But this is going to have other problems, namely because |
||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
$custom_header = $elements->item( 0 ); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
return $custom_header instanceof DOMElement ? $custom_header : null; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||
|
@@ -165,9 +181,9 @@ private function get_cover_blocks( Document $document ) { | |||||||||||||||||||||||||||||||||
* @param DOMElement[] $hero_image_elements Elements that are viable hero | ||||||||||||||||||||||||||||||||||
* images. | ||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||
private function add_data_hero_attribute( $hero_image_elements ) { | ||||||||||||||||||||||||||||||||||
private function add_data_hero_candidate_attribute( $hero_image_elements ) { | ||||||||||||||||||||||||||||||||||
foreach ( $hero_image_elements as $hero_image_element ) { | ||||||||||||||||||||||||||||||||||
$hero_image_element->setAttribute( Attribute::DATA_HERO, null ); | ||||||||||||||||||||||||||||||||||
$hero_image_element->setAttribute( Attribute::DATA_HERO_CANDIDATE, null ); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than having to do this for static analysis, the
getElementId
method could indicate the$element
is aDOMElement
or anElement
.