From e54d0225d43e19519567d8aeecbc08758bbdf91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rabbi=20Islam=20Rony=20=E2=9A=A1=EF=B8=8F?= <35329385+RabbiIslamRony@users.noreply.github.com> Date: Mon, 21 Sep 2026 09:54:50 +0600 Subject: [PATCH 1/2] fix: fall back from malformed archive layouts --- includes/helper-functions.php | 40 ++++++++++++++ .../listing-archive-layout-fallback.php | 54 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 tests/wp-cli/listing-archive-layout-fallback.php diff --git a/includes/helper-functions.php b/includes/helper-functions.php index fcf25c0272..e6e9f9b8ce 100644 --- a/includes/helper-functions.php +++ b/includes/helper-functions.php @@ -5052,6 +5052,46 @@ function directorist_listing_archive_fields( int $directory_type_id, array $data $card_fields = get_term_meta( $directory_type_id, 'listings_card_grid_view', true ); $list_fields = get_term_meta( $directory_type_id, 'listings_card_list_view', true ); + $is_valid_layout = static function ( $layout, $view ) { + if ( ! is_array( $layout ) || empty( $layout['active_template'] ) || empty( $layout['template_data'] ) || ! is_array( $layout['template_data'] ) ) { + return false; + } + + $template = $layout['active_template']; + $allowed_templates = [ + 'grid' => [ 'grid_view_with_thumbnail', 'grid_view_without_thumbnail' ], + 'list' => [ 'list_view_with_thumbnail', 'list_view_without_thumbnail' ], + ]; + + return isset( $allowed_templates[ $view ] ) + && in_array( $template, $allowed_templates[ $view ], true ) + && isset( $layout['template_data'][ $template ] ) + && is_array( $layout['template_data'][ $template ] ); + }; + + if ( ! $is_valid_layout( $card_fields, 'grid' ) || ! $is_valid_layout( $list_fields, 'list' ) ) { + static $default_archive_fields = null; + + if ( null === $default_archive_fields && class_exists( '\\Directorist\\Multi_Directory\\Multi_Directory_Migration' ) ) { + $migration = new \Directorist\Multi_Directory\Multi_Directory_Migration(); + $widgets = $migration->get_listings_card_wedgets_data(); + $args = [ 'listings_card_wedgets' => $widgets ]; + + $default_archive_fields = [ + 'card_fields' => $migration->get_listings_card_grid_view_data( $args ), + 'list_fields' => $migration->get_listings_card_list_view_data( $args ), + ]; + } + + if ( ! $is_valid_layout( $card_fields, 'grid' ) && ! empty( $default_archive_fields['card_fields'] ) ) { + $card_fields = $default_archive_fields['card_fields']; + } + + if ( ! $is_valid_layout( $list_fields, 'list' ) && ! empty( $default_archive_fields['list_fields'] ) ) { + $list_fields = $default_archive_fields['list_fields']; + } + } + $data['directory_type_id'] = $directory_type_id; return apply_filters( diff --git a/tests/wp-cli/listing-archive-layout-fallback.php b/tests/wp-cli/listing-archive-layout-fallback.php new file mode 100644 index 0000000000..8801c79c77 --- /dev/null +++ b/tests/wp-cli/listing-archive-layout-fallback.php @@ -0,0 +1,54 @@ + ATBDP_TYPE, + 'hide_empty' => false, + 'number' => 1, + 'fields' => 'ids', + ] +); + +if ( is_wp_error( $directories ) || empty( $directories ) ) { + WP_CLI::error( 'No directory type is available for the archive-layout smoke test.' ); +} + +$directory_id = (int) $directories[0]; +$meta_key = 'listings_card_list_view'; +$original = get_term_meta( $directory_id, $meta_key, true ); +$grid_before = get_term_meta( $directory_id, 'listings_card_grid_view', true ); + +try { + update_term_meta( $directory_id, $meta_key, [ null ] ); + clean_term_cache( $directory_id, ATBDP_TYPE ); + + $fields = directorist_listing_archive_fields( $directory_id ); + $list_fields = $fields['list_fields'] ?? []; + $template = $list_fields['active_template'] ?? ''; + $template_data = $list_fields['template_data'][ $template ] ?? null; + + if ( empty( $template ) || ! is_array( $template_data ) ) { + WP_CLI::error( 'Malformed list layout did not fall back to a renderable default.' ); + } + + if ( $grid_before !== $fields['card_fields'] ) { + WP_CLI::error( 'The valid grid layout changed while recovering the malformed list layout.' ); + } + + WP_CLI::success( 'Malformed list layout falls back to a renderable default.' ); +} finally { + update_term_meta( $directory_id, $meta_key, $original ); + clean_term_cache( $directory_id, ATBDP_TYPE ); +} From 7d7bdcd4aeafa09d8a251694faca13581ffaea4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rabbi=20Islam=20Rony=20=E2=9A=A1=EF=B8=8F?= <35329385+RabbiIslamRony@users.noreply.github.com> Date: Mon, 21 Sep 2026 10:00:53 +0600 Subject: [PATCH 2/2] chore: remove WP-CLI smoke test --- .../listing-archive-layout-fallback.php | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 tests/wp-cli/listing-archive-layout-fallback.php diff --git a/tests/wp-cli/listing-archive-layout-fallback.php b/tests/wp-cli/listing-archive-layout-fallback.php deleted file mode 100644 index 8801c79c77..0000000000 --- a/tests/wp-cli/listing-archive-layout-fallback.php +++ /dev/null @@ -1,54 +0,0 @@ - ATBDP_TYPE, - 'hide_empty' => false, - 'number' => 1, - 'fields' => 'ids', - ] -); - -if ( is_wp_error( $directories ) || empty( $directories ) ) { - WP_CLI::error( 'No directory type is available for the archive-layout smoke test.' ); -} - -$directory_id = (int) $directories[0]; -$meta_key = 'listings_card_list_view'; -$original = get_term_meta( $directory_id, $meta_key, true ); -$grid_before = get_term_meta( $directory_id, 'listings_card_grid_view', true ); - -try { - update_term_meta( $directory_id, $meta_key, [ null ] ); - clean_term_cache( $directory_id, ATBDP_TYPE ); - - $fields = directorist_listing_archive_fields( $directory_id ); - $list_fields = $fields['list_fields'] ?? []; - $template = $list_fields['active_template'] ?? ''; - $template_data = $list_fields['template_data'][ $template ] ?? null; - - if ( empty( $template ) || ! is_array( $template_data ) ) { - WP_CLI::error( 'Malformed list layout did not fall back to a renderable default.' ); - } - - if ( $grid_before !== $fields['card_fields'] ) { - WP_CLI::error( 'The valid grid layout changed while recovering the malformed list layout.' ); - } - - WP_CLI::success( 'Malformed list layout falls back to a renderable default.' ); -} finally { - update_term_meta( $directory_id, $meta_key, $original ); - clean_term_cache( $directory_id, ATBDP_TYPE ); -}