PluginProbe
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.2.2
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.2.2
4.7.2 4.7.1 4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 All 281 releases
surecart / app / src / Models / GalleryItemImageAttachment.php
GalleryItemImageAttachment.php
251 lines 7.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace SureCart\Models;
3
4 use SureCart\Models\GalleryItem as ModelsGalleryItem;
5 use SureCart\Support\Contracts\GalleryItem;
6
7 /**
8 * Gallery item model for image attachments
9 */
10 class GalleryItemImageAttachment extends ModelsGalleryItem implements GalleryItem {
11 /**
12 * Create a new gallery item.
13 *
14 * @param int|\WP_Post $item The item.
15 *
16 * @return void
17 */
18 public function __construct( $item ) {
19 if ( empty( $item ) ) {
20 return;
21 }
22
23 if ( $item instanceof \WP_Post ) {
24 $this->item = $item;
25 return;
26 }
27
28 $this->item = get_post( $item['id'] ?? $item );
29 }
30
31 /**
32 * Get the thumbnail attribute markup.
33 *
34 * @param string $size The size of the image.
35 * @param array $attr The attributes for the tag.
36 * @param array $metadata Additional metadata.
37 *
38 * @return string
39 */
40 public function thumbnail( $size = 'full', $attr = [], $metadata = [] ): string {
41 return $this->html( $size, $attr, $metadata );
42 }
43
44 /**
45 * Get the media attribute markup.
46 *
47 * @param string $size The size of the image.
48 * @param array $attr The attributes for the tag.
49 * @param array $metadata Additional metadata for the lightbox.
50 *
51 * @return string
52 */
53 public function html( $size = 'full', $attr = [], $metadata = [] ): string {
54 // If the item is not set, return null.
55 if ( ! isset( $this->item->ID ) ) {
56 return '';
57 }
58
59 // Handle image attachments.
60 $image = wp_get_attachment_image( $this->item->ID, $size, false, $attr );
61
62 // add any styles.
63 $tags = new \WP_HTML_Tag_Processor( $image );
64
65 // get the image tag.
66 $has_image = $tags->next_tag( 'img' );
67
68 // add inline styles.
69 if ( ! empty( $attr['style'] ) ) {
70 if ( $has_image && ! empty( $attr['style'] ) ) {
71 $tags->set_attribute( 'style', $attr['style'] );
72 }
73 }
74
75 if ( $this->with_lightbox ) {
76 $this->with_lightbox = false; // reset to false.
77
78 // get the image data.
79 $full_data = $this->attributes( 'full' );
80
81 // set the lightbox state.
82 wp_interactivity_state(
83 'surecart/lightbox',
84 array(
85 'metadata' => array(
86 // metadata keyed by unique image id.
87 $this->id => wp_parse_args(
88 $metadata,
89 array(
90 'uploadedSrc' => $full_data->src ?? '',
91 'imgClassNames' => $full_data->class ?? '',
92 'targetWidth' => $full_data->width ?? 0,
93 'targetHeight' => $full_data->height ?? 0,
94 'scaleAttr' => false, // false or 'contain'.
95 'alt' => $full_data->alt ?? '',
96 // translators: %s is the image title.
97 'screenReaderText' => sprintf( __( 'Viewing image: %s.', 'surecart' ), $this->post_title ),
98 'galleryId' => get_the_ID(),
99 ),
100 ),
101 ),
102 )
103 );
104
105 $tags->set_attribute( 'data-wp-on--load', 'callbacks.setImageRef' );
106 $tags->set_attribute( 'data-wp-init', 'callbacks.setImageRef' );
107 $tags->set_attribute( 'data-wp-on--click', 'actions.showLightbox' );
108 $tags->set_attribute( 'data-wp-class--sc-hide', 'state.isContentHidden' );
109 $tags->set_attribute( 'data-wp-class--sc-show', 'state.isContentVisible' );
110 $tags->add_class( 'has-image-lightbox' );
111
112 // add the lightbox trigger button.
113 return $tags->get_updated_html() .
114 '<button
115 class="lightbox-trigger"
116 type="button"
117 aria-haspopup="dialog"
118 aria-label="' . esc_attr__( 'Expand image', 'surecart' ) . '"
119 data-wp-init="callbacks.initTriggerButton"
120 data-wp-on--click="actions.showLightbox"
121 data-wp-style--right="state.imageButtonRight"
122 data-wp-style--top="state.imageButtonTop"
123 >
124 ' . \SureCart::svg()->get(
125 'maximize',
126 [
127 'width' => 16,
128 'height' => 16,
129 'aria-hidden' => 'true',
130 ]
131 ) . '
132 </button>';
133 }
134
135 // return updated html.
136 return $tags->get_updated_html();
137 }
138
139 /**
140 * Get the image data.
141 *
142 * @param string $size The size of the image.
143 * @param array $attr The attributes for the tag.
144 *
145 * @return object
146 */
147 public function attributes( $size = 'full', $attr = [] ): object {
148 // If the item is not set, return null.
149 if ( ! isset( $this->item->ID ) ) {
150 return (object) [];
151 }
152
153 $image = wp_get_attachment_image_src( $this->item->ID, $size, $attr['icon'] ?? false, $attr );
154
155 if ( ! $image ) {
156 return (object) [];
157 }
158
159 list( $src, $width, $height ) = $image;
160
161 $attachment = get_post( $this->item->ID );
162 $size_class = $size;
163
164 if ( is_array( $size_class ) ) {
165 $size_class = implode( 'x', $size_class );
166 }
167
168 $default_attr = array(
169 'src' => $src,
170 'class' => "attachment-$size_class size-$size_class",
171 'alt' => trim( wp_strip_all_tags( get_post_meta( $this->item->ID, '_wp_attachment_image_alt', true ) ) ),
172 'width' => $width,
173 'height' => $height,
174 );
175
176 /**
177 * Filters the context in which wp_get_attachment_image() is used.
178 *
179 * @since 6.3.0
180 *
181 * @param string $context The context. Default 'wp_get_attachment_image'.
182 */
183 $context = apply_filters( 'wp_get_attachment_image_context', 'wp_get_attachment_image' );
184 $attr = wp_parse_args( $attr, $default_attr );
185
186 $loading_attr = $attr;
187 $loading_attr['width'] = $width;
188 $loading_attr['height'] = $height;
189 $loading_optimization_attr = wp_get_loading_optimization_attributes(
190 'img',
191 $loading_attr,
192 $context
193 );
194
195 // Add loading optimization attributes if not available.
196 $attr = array_merge( $attr, $loading_optimization_attr );
197
198 // Omit the `decoding` attribute if the value is invalid according to the spec.
199 if ( empty( $attr['decoding'] ) || ! in_array( $attr['decoding'], array( 'async', 'sync', 'auto' ), true ) ) {
200 unset( $attr['decoding'] );
201 }
202
203 /*
204 * If the default value of `lazy` for the `loading` attribute is overridden
205 * to omit the attribute for this image, ensure it is not included.
206 */
207 if ( isset( $attr['loading'] ) && ! $attr['loading'] ) {
208 unset( $attr['loading'] );
209 }
210
211 // If the `fetchpriority` attribute is overridden and set to false or an empty string.
212 if ( isset( $attr['fetchpriority'] ) && ! $attr['fetchpriority'] ) {
213 unset( $attr['fetchpriority'] );
214 }
215
216 // Generate 'srcset' and 'sizes' if not already present.
217 if ( empty( $attr['srcset'] ) ) {
218 $image_meta = wp_get_attachment_metadata( $this->item->ID );
219
220 if ( is_array( $image_meta ) ) {
221 $size_array = array( absint( $width ), absint( $height ) );
222 $srcset = wp_calculate_image_srcset( $size_array, $src, $image_meta, $this->item->ID );
223 $sizes = wp_calculate_image_sizes( $size_array, $src, $image_meta, $this->item->ID );
224
225 if ( $srcset && ( $sizes || ! empty( $attr['sizes'] ) ) ) {
226 $attr['srcset'] = $srcset;
227
228 if ( empty( $attr['sizes'] ) ) {
229 $attr['sizes'] = $sizes;
230 }
231 }
232 }
233 }
234
235 /**
236 * Filters the list of attachment image attributes.
237 *
238 * @since 2.8.0
239 *
240 * @param string[] $attr Array of attribute values for the image markup, keyed by attribute name.
241 * See wp_get_attachment_image().
242 * @param WP_Post $attachment Image attachment post.
243 * @param string|int[] $size Requested image size. Can be any registered image size name, or
244 * an array of width and height values in pixels (in that order).
245 */
246 $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, $attachment, $size );
247
248 return (object) $attr;
249 }
250 }
251