Commit 9842e16b1bf for woocommerce

commit 9842e16b1bfe4d753d3e79f2b32d4f718524a49e
Author: Tung Du <dinhtungdu@gmail.com>
Date:   Wed Sep 2 17:03:55 2026 +0700

    Fix visual attribute term column TypeError (#68257)

    * Fix visual attribute column content type handling

    * Add changelog entry for visual attribute column fix

diff --git a/plugins/woocommerce/changelog/wc-slack-1788330585798149-investigation b/plugins/woocommerce/changelog/wc-slack-1788330585798149-investigation
new file mode 100644
index 00000000000..075cef3f799
--- /dev/null
+++ b/plugins/woocommerce/changelog/wc-slack-1788330585798149-investigation
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Prevent a critical error when adding terms to Color/Image product attributes.
diff --git a/plugins/woocommerce/src/Internal/ProductAttributes/VisualAttributeTermAdmin.php b/plugins/woocommerce/src/Internal/ProductAttributes/VisualAttributeTermAdmin.php
index b1017c5a585..d577ec6d4d1 100644
--- a/plugins/woocommerce/src/Internal/ProductAttributes/VisualAttributeTermAdmin.php
+++ b/plugins/woocommerce/src/Internal/ProductAttributes/VisualAttributeTermAdmin.php
@@ -387,7 +387,7 @@ class VisualAttributeTermAdmin implements RegisterHooksInterface {
 	 *
 	 * @internal
 	 *
-	 * @param string $content  Column output so far.
+	 * @param mixed  $content  Column output so far.
 	 * @param string $column   Current column key.
 	 * @param int    $term_id  Term ID.
 	 * @param string $taxonomy Taxonomy slug.
@@ -395,7 +395,7 @@ class VisualAttributeTermAdmin implements RegisterHooksInterface {
 	 */
 	public function render_term_visual_column( $content, $column, $term_id, $taxonomy ): string {
 		if ( 'visual' !== $column || ! VisualAttributeTermMeta::is_visual_attribute_taxonomy( $taxonomy ) ) {
-			return $content;
+			return is_string( $content ) ? $content : '';
 		}

 		$image_id = absint( get_term_meta( $term_id, 'image', true ) );
diff --git a/plugins/woocommerce/tests/php/src/Internal/ProductAttributes/VisualAttributeTermAdminTest.php b/plugins/woocommerce/tests/php/src/Internal/ProductAttributes/VisualAttributeTermAdminTest.php
index c62e4977dfd..ecb01a3d14e 100644
--- a/plugins/woocommerce/tests/php/src/Internal/ProductAttributes/VisualAttributeTermAdminTest.php
+++ b/plugins/woocommerce/tests/php/src/Internal/ProductAttributes/VisualAttributeTermAdminTest.php
@@ -236,6 +236,37 @@ class VisualAttributeTermAdminTest extends WC_Unit_Test_Case {
 		}
 	}

+	/**
+	 * @testdox Should preserve string content and normalize non-string content when passing through another column.
+	 * @dataProvider column_content_provider
+	 *
+	 * @param mixed  $content Column content.
+	 * @param string $expected Expected content.
+	 */
+	public function test_normalizes_column_content( $content, string $expected ): void {
+		$instance = wc_get_container()->get( VisualAttributeTermAdmin::class );
+
+		$this->assertSame(
+			$expected,
+			$instance->render_term_visual_column( $content, 'another-column', 1, 'pa_color' ),
+			'Column content should remain a string.'
+		);
+	}
+
+	/**
+	 * Data provider for column content normalization.
+	 *
+	 * @return array
+	 */
+	public function column_content_provider(): array {
+		return array(
+			'string content' => array( 'existing content', 'existing content' ),
+			'null content'   => array( null, '' ),
+			'array content'  => array( array(), '' ),
+			'object content' => array( new \stdClass(), '' ),
+		);
+	}
+
 	/**
 	 * @testdox Should not throw a TypeError when the current screen has a non-string id.
 	 *