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.
*