Inventory_Presser_Admin_Photo_Arranger::add_attachment_to_gallery( mixed $post_id, mixed $parent_id = null )

add_attachment_to_gallery


Parameters

$post_id

(mixed) (Required)

$parent_id

(mixed) (Optional)

Default value: null


Return

(void)


Source

File: includes/admin/class-admin-photo-arranger.php

	public function add_attachment_to_gallery( $post_id, $parent_id = null ) {
		$attachment = get_post( $post_id );

		// Is this attachment an image?
		if ( ! wp_attachment_is_image( $attachment ) ) {
			// No.
			return;
		}

		// Is this new attachment even attached to a post?
		$parent;
		if ( ! empty( $attachment->post_parent ) ) {
			$parent = get_post( $attachment->post_parent );
		} elseif ( ! empty( $parent_id ) ) {
			$parent = get_post( $parent_id );
		} else {
			return;
		}

		// Is the new attachment attached to a vehicle?
		if ( empty( $parent->post_type ) || INVP::POST_TYPE !== $parent->post_type ) {
			// Parent post isn't a vehicle.
			return;
		}

		// Update the photo's post_parent.
		if ( empty( $attachment->post_parent ) || $attachment->post_parent !== $parent->ID ) {
			$attachment->post_parent = $parent->ID;
			$this->safe_update_post( $attachment );
		}

		// Loop over all the post's blocks in search of our Gallery.
		$blocks = parse_blocks( $parent->post_content );
		foreach ( $blocks as $index => &$block ) {
			// Is this a core gallery block? With a specific CSS class?
			if ( ! $this->is_gallery_block_with_specific_css_class( $block ) ) {
				continue;
			}

			// Does the block already have this attachment?
			if ( ! $this->inner_blocks_contains_id( $block, $post_id ) ) {
				// Add the uploaded attachment to this gallery.
				$block['innerBlocks'][] = array(
					'blockName'    => 'core/image',
					'attrs'        => array(
						'id'              => $post_id,
						'sizeSlug'        => 'large',
						'linkDestination' => 'none',
					),
					'innerBlocks'  => array(),
					'innerHTML'    => '',
					'innerContent' => array(
						0 => '',
					),
				);
			}

			$photo_count = count( $block['innerBlocks'] );

			// Change a CSS class to reflect the number of photos in the Gallery
			// Replace all 'columns-#'.
			$block['innerContent'][0] = preg_replace(
				'/ columns-[0-9]+/',
				' columns-' . $photo_count ?? 1,
				$block['innerContent'][0]
			);
			// Do it again with extra parameter to replace just the first with a max of 'columns-3'.
			$block['innerContent'][0] = preg_replace(
				'/ columns-[0-9]+/',
				' columns-' . min( 3, $photo_count ?? 4 ),
				$block['innerContent'][0],
				1
			);
			if ( false === strpos( $block['attrs']['className'] ?? '', 'columns-' ) ) {
				$block['attrs']['className'] = sprintf(
					'columns-%s %s',
					$photo_count ?? 1,
					$block['attrs']['className']
				);
			} else {
				$block['attrs']['className'] = preg_replace(
					'/columns-[0-9]+/',
					'columns-' . $photo_count ?? 1,
					$block['attrs']['className'],
					1
				);
			}

			// Add HTML that renders the image in the gallery
			// Is this image already in the Gallery HTML though?
			if ( false === mb_strpos( $block['innerContent'][0], "class=\"wp-image-$post_id\"" ) ) {
				// No.
				$position_list_end        = mb_strpos( $block['innerContent'][0], "</figure>\r\n<!-- /wp:gallery -->" );
				$new_html                 = sprintf(
					'<!-- wp:image {"id":%1$d,"sizeSlug":"large","linkDestination":"none"} --><figure class="wp-block-image size-large"><img src="%2$s" alt="" class="wp-image-%1$d"/></figure><!-- /wp:image -->',
					$post_id,
					$attachment->guid
				);
				$block['innerContent'][0] =
					substr( $block['innerContent'][0], 0, $position_list_end )
					. $new_html
					. substr( $block['innerContent'][0], ( $position_list_end ) );
			}

			// Update the block in the $blocks array.
			$blocks[ $index ] = $block;

			// and then update the post.
			$parent->post_content = serialize_blocks( $blocks );
			$this->safe_update_post( $parent );
			break;
		}
	}