From 52632e67a087a9f1e0b26076ae51a6f32ca1f839 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 03:22:14 +0000 Subject: [PATCH 01/27] chore(deps): bump codeinwp/themeisle-sdk from 3.3.49 to 3.3.50 Bumps [codeinwp/themeisle-sdk](https://github.com/Codeinwp/themeisle-sdk) from 3.3.49 to 3.3.50. - [Release notes](https://github.com/Codeinwp/themeisle-sdk/releases) - [Changelog](https://github.com/Codeinwp/themeisle-sdk/blob/v3.3.50/CHANGELOG.md) - [Commits](https://github.com/Codeinwp/themeisle-sdk/compare/v3.3.49...v3.3.50) --- updated-dependencies: - dependency-name: codeinwp/themeisle-sdk dependency-version: 3.3.50 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index ca4524bc..1c87216b 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "codeinwp/themeisle-sdk", - "version": "3.3.49", + "version": "3.3.50", "source": { "type": "git", "url": "https://github.com/Codeinwp/themeisle-sdk.git", - "reference": "605f78bbbd8526f7597a89077791043d9ecc8c20" + "reference": "3c1f8dfc2390e667bbc086c5d660900a7985efa6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/605f78bbbd8526f7597a89077791043d9ecc8c20", - "reference": "605f78bbbd8526f7597a89077791043d9ecc8c20", + "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/3c1f8dfc2390e667bbc086c5d660900a7985efa6", + "reference": "3c1f8dfc2390e667bbc086c5d660900a7985efa6", "shasum": "" }, "require-dev": { @@ -43,9 +43,9 @@ ], "support": { "issues": "https://github.com/Codeinwp/themeisle-sdk/issues", - "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.49" + "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.50" }, - "time": "2025-09-18T13:41:05+00:00" + "time": "2025-11-25T19:36:35+00:00" } ], "packages-dev": [ From 295d5199bfd27448898e9d56057a9b8986f84981 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Mon, 1 Dec 2025 14:11:04 +0530 Subject: [PATCH 02/27] remove crons on uninstallation --- uninstall.php | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/uninstall.php b/uninstall.php index 47ac634e..41607041 100644 --- a/uninstall.php +++ b/uninstall.php @@ -32,3 +32,53 @@ delete_option( 'feedzy_fresh_install' ); delete_option( 'feedzy_wizard_data' ); delete_option( 'feedzy_usage' ); + +/** + * Clear scheduled hook. + * + * @param string $hook The name of the hook to clear. + * @param array $args Optional. Arguments that were to be passed to the hook's callback function. Default empty array. + * @return mixed The scheduled action ID if a scheduled action was found, or null if no matching action found. If WP_Cron is used, on success an integer indicating number of events unscheduled, false or WP_Error if unscheduling one or more events fail. + */ +function clear_scheduled_hook( $hook, $args = array() ) { + if ( function_exists( 'as_unschedule_all_actions' ) ) { + return as_unschedule_all_actions( $hook, $args ); + } + + return wp_clear_scheduled_hook( $hook, $args ); +} + +clear_scheduled_hook( 'feedzy_rss_feeds_log_activity' ); + +clear_scheduled_hook( 'feedzy_cron' ); + +clear_scheduled_hook( 'task_feedzy_cleanup_logs' ); + +clear_scheduled_hook( 'task_feedzy_send_error_report' ); + +// Remove import jobs based cron jobs. +$import_job_crons = get_posts( + array( + 'post_type' => 'feedzy_imports', + 'post_status' => 'publish', + 'numberposts' => 99, + 'fields' => 'ids', + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => 'fz_cron_schedule', + 'compare' => 'EXISTS', + ), + ), + ) +); + + +if ( ! empty( $import_job_crons ) ) { + + foreach ( $import_job_crons as $job_id ) { + $fz_cron_schedule = get_post_meta( $job_id, 'fz_cron_schedule', true ); + clear_scheduled_hook( 'feedzy_cron', array( 100, $job_id ) ); + } +} From 0151be8b27279b09a061a47c8c713855894f817a Mon Sep 17 00:00:00 2001 From: selul Date: Wed, 3 Dec 2025 13:31:37 +0200 Subject: [PATCH 03/27] trigger compare --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59389f67..e3599fe8 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "feedzy-rss-feeds", "version": "5.1.2", - "description": "Feedzy RSS Feeds - lite version.", + "description": "Feedzy RSS Feeds - lite version", "repository": { "type": "git", "url": "git+https://github.com/Codeinwp/feedzy-rss-feeds.git" From 00211a922054ec4399ee0a427f425c437b3b834c Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Mon, 15 Dec 2025 17:34:47 +0530 Subject: [PATCH 04/27] fix: deprecated notice --- includes/abstract/feedzy-rss-feeds-admin-abstract.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/abstract/feedzy-rss-feeds-admin-abstract.php b/includes/abstract/feedzy-rss-feeds-admin-abstract.php index 2cc5d0a4..623004df 100644 --- a/includes/abstract/feedzy-rss-feeds-admin-abstract.php +++ b/includes/abstract/feedzy-rss-feeds-admin-abstract.php @@ -858,7 +858,7 @@ private function init_feed( $feed_url, $cache, $sc, $allow_https = FEEDZY_ALLOW_ require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php'; require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php'; - $feed->set_file_class( 'WP_SimplePie_File' ); + $feed->get_registry( 'WP_SimplePie_File' ); $default_agent = $this->get_default_user_agent( $feed_url ); $feed->set_useragent( apply_filters( 'http_headers_useragent', $default_agent ) ); if ( false === apply_filters( 'feedzy_disable_db_cache', false, $feed_url ) ) { From 71e55e71bf6b3bf94d6977ee3ffc9fb43b6d2d44 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Mon, 15 Dec 2025 17:43:02 +0530 Subject: [PATCH 05/27] fix: deprecated notice --- includes/abstract/feedzy-rss-feeds-admin-abstract.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/abstract/feedzy-rss-feeds-admin-abstract.php b/includes/abstract/feedzy-rss-feeds-admin-abstract.php index 623004df..f5cb2c6c 100644 --- a/includes/abstract/feedzy-rss-feeds-admin-abstract.php +++ b/includes/abstract/feedzy-rss-feeds-admin-abstract.php @@ -858,7 +858,7 @@ private function init_feed( $feed_url, $cache, $sc, $allow_https = FEEDZY_ALLOW_ require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php'; require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php'; - $feed->get_registry( 'WP_SimplePie_File' ); + $feed->get_registry()->register( SimplePie\File::class, 'WP_SimplePie_File' ); $default_agent = $this->get_default_user_agent( $feed_url ); $feed->set_useragent( apply_filters( 'http_headers_useragent', $default_agent ) ); if ( false === apply_filters( 'feedzy_disable_db_cache', false, $feed_url ) ) { From 978c0b41b885d0238c24e8dfcde7afe181a9a8ce Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Mon, 15 Dec 2025 18:02:52 +0530 Subject: [PATCH 06/27] enable legacy support --- includes/abstract/feedzy-rss-feeds-admin-abstract.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/abstract/feedzy-rss-feeds-admin-abstract.php b/includes/abstract/feedzy-rss-feeds-admin-abstract.php index f5cb2c6c..ff0e0537 100644 --- a/includes/abstract/feedzy-rss-feeds-admin-abstract.php +++ b/includes/abstract/feedzy-rss-feeds-admin-abstract.php @@ -858,7 +858,7 @@ private function init_feed( $feed_url, $cache, $sc, $allow_https = FEEDZY_ALLOW_ require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php'; require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php'; - $feed->get_registry()->register( SimplePie\File::class, 'WP_SimplePie_File' ); + $feed->get_registry()->register( SimplePie\File::class, 'WP_SimplePie_File', true ); $default_agent = $this->get_default_user_agent( $feed_url ); $feed->set_useragent( apply_filters( 'http_headers_useragent', $default_agent ) ); if ( false === apply_filters( 'feedzy_disable_db_cache', false, $feed_url ) ) { From 69347e03db993f7694fba9ca392d59a3ef1590c6 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Tue, 16 Dec 2025 19:24:36 +0530 Subject: [PATCH 07/27] fix: e2e --- tests/e2e/specs/classic-block.spec.js | 4 ++-- tests/e2e/specs/loop.spec.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/e2e/specs/classic-block.spec.js b/tests/e2e/specs/classic-block.spec.js index 17733bce..991480ab 100644 --- a/tests/e2e/specs/classic-block.spec.js +++ b/tests/e2e/specs/classic-block.spec.js @@ -21,7 +21,7 @@ test.describe('Feedzy Classic Block', () => { await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page @@ -49,7 +49,7 @@ test.describe('Feedzy Classic Block', () => { await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page diff --git a/tests/e2e/specs/loop.spec.js b/tests/e2e/specs/loop.spec.js index 358b37ac..e7f1c72c 100644 --- a/tests/e2e/specs/loop.spec.js +++ b/tests/e2e/specs/loop.spec.js @@ -119,7 +119,7 @@ test.describe('Feedzy Loop', () => { .fill('http://invalid-url.com/feed'); await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page @@ -146,7 +146,7 @@ test.describe('Feedzy Loop', () => { ); await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page From 42dc51eeb4a62b071404fb006049b8dcdab13a63 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Tue, 16 Dec 2025 19:31:25 +0530 Subject: [PATCH 08/27] fix: e2e --- tests/e2e/specs/classic-block.spec.js | 4 ++-- tests/e2e/specs/loop.spec.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/e2e/specs/classic-block.spec.js b/tests/e2e/specs/classic-block.spec.js index 17733bce..991480ab 100644 --- a/tests/e2e/specs/classic-block.spec.js +++ b/tests/e2e/specs/classic-block.spec.js @@ -21,7 +21,7 @@ test.describe('Feedzy Classic Block', () => { await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page @@ -49,7 +49,7 @@ test.describe('Feedzy Classic Block', () => { await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page diff --git a/tests/e2e/specs/loop.spec.js b/tests/e2e/specs/loop.spec.js index 358b37ac..e7f1c72c 100644 --- a/tests/e2e/specs/loop.spec.js +++ b/tests/e2e/specs/loop.spec.js @@ -119,7 +119,7 @@ test.describe('Feedzy Loop', () => { .fill('http://invalid-url.com/feed'); await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page @@ -146,7 +146,7 @@ test.describe('Feedzy Loop', () => { ); await page.getByRole('button', { name: 'Load Feed' }).click(); - await page.waitForSelector('.feedzy-validation-results'); + await page.waitForSelector('.feedzy-validation-results', { timeout: 30000 }); await expect( page From 29da353129e9f074b3cbc19d478e17045a091dc9 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Mon, 22 Dec 2025 12:24:03 +0530 Subject: [PATCH 09/27] fix: php warning --- includes/admin/feedzy-rss-feeds-import.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/includes/admin/feedzy-rss-feeds-import.php b/includes/admin/feedzy-rss-feeds-import.php index 650315a6..c08f5c42 100644 --- a/includes/admin/feedzy-rss-feeds-import.php +++ b/includes/admin/feedzy-rss-feeds-import.php @@ -446,11 +446,11 @@ public function feedzy_import_feed_options() { $import_post_type = get_post_meta( $post->ID, 'import_post_type', true ); $import_post_term = get_post_meta( $post->ID, 'import_post_term', true ); - if ( metadata_exists( $import_post_type, $post->ID, 'import_post_status' ) ) { - $import_post_status = get_post_meta( $post->ID, 'import_post_status', true ); - } else { - add_post_meta( $post->ID, 'import_post_status', 'publish' ); - $import_post_status = get_post_meta( $post->ID, 'import_post_status', true ); + + $import_post_status = get_post_meta( $post->ID, 'import_post_status', true ); + if ( empty( $import_post_status ) ) { + $import_post_status = 'publish'; + update_post_meta( $post->ID, 'import_post_status', $import_post_status ); } $source = get_post_meta( $post->ID, 'source', true ); $inc_key = get_post_meta( $post->ID, 'inc_key', true ); From 0f08494997d4c584907e2dc3717278ef55aeb361 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Thu, 8 Jan 2026 11:24:18 +0530 Subject: [PATCH 10/27] fix: preserve HTML tags in content area --- css/settings.css | 4 ++ includes/admin/feedzy-rss-feeds-actions.php | 11 ++++ includes/admin/feedzy-rss-feeds-import.php | 1 + includes/feedzy-rss-feeds-feed-tweaks.php | 69 +++++++++++++++++++++ includes/views/js/import-metabox-edit.js | 46 ++++++++++++++ 5 files changed, 131 insertions(+) diff --git a/css/settings.css b/css/settings.css index f4a89a5d..62428c54 100644 --- a/css/settings.css +++ b/css/settings.css @@ -2971,3 +2971,7 @@ button.feedzy-action-button { font-size: 12px; padding: 4px 12px; } +.tagify__tag .feedzy-custom-tag { + cursor: auto; + line-height: 1.5; +} diff --git a/includes/admin/feedzy-rss-feeds-actions.php b/includes/admin/feedzy-rss-feeds-actions.php index e7bb7815..66b09aa3 100644 --- a/includes/admin/feedzy-rss-feeds-actions.php +++ b/includes/admin/feedzy-rss-feeds-actions.php @@ -315,6 +315,8 @@ public function action_process() { return $this->generate_image(); case 'modify_links': return $this->modify_links(); + case 'custom_html': + return $this->custom_html(); default: return $this->default_content(); } @@ -619,5 +621,14 @@ private function custom_field() { } return $this->default_value; } + + /** + * Get Custom HTML tag. + * + * @return string + */ + private function custom_html() { + return $this->current_job->tag; + } } } diff --git a/includes/admin/feedzy-rss-feeds-import.php b/includes/admin/feedzy-rss-feeds-import.php index 650315a6..c7de5e0a 100644 --- a/includes/admin/feedzy-rss-feeds-import.php +++ b/includes/admin/feedzy-rss-feeds-import.php @@ -643,6 +643,7 @@ public function save_feedzy_import_feed_meta( $post_id, $post ) { } } else { if ( 'import_post_content' === $key ) { + $val = escape_html_to_tag( $val ); $val = feedzy_custom_tag_escape( $val ); } elseif ( 'default_thumbnail_id' === $key && ! empty( $val ) ) { $val = explode( ',', $val ); diff --git a/includes/feedzy-rss-feeds-feed-tweaks.php b/includes/feedzy-rss-feeds-feed-tweaks.php index 48d8338e..953dd6bc 100644 --- a/includes/feedzy-rss-feeds-feed-tweaks.php +++ b/includes/feedzy-rss-feeds-feed-tweaks.php @@ -672,3 +672,72 @@ function feedzy_show_review_notice() { return $imported_posts->have_posts(); } + +/** + * Escape the HTML tag and convert it to the tagify tag value. + * + * @param string $content Content. + * @return string + */ +function escape_html_to_tag( $content ) { + + $protected_blocks = array(); + $placeholder_tpl = '__TAG_%d__'; + + $content = preg_replace_callback( + '/\[\[\{[\s\S]*?\}\]\]/', + function ( $value ) use ( &$protected_blocks, $placeholder_tpl ) { + $index = count( $protected_blocks ); + $protected_blocks[] = $value[0]; + return sprintf( $placeholder_tpl, $index ); + }, + $content + ); + + $base_content = $content; + $html_tags = array(); + $converted_value = ''; + + if ( preg_match_all( '/<[^>]+>[\s\S]*?<\/[^>]+>/', $content, $matches ) ) { + foreach ( $matches[0] as $match ) { + + $base_content = str_replace( $match, '', $base_content ); + $html_tags[] = array( + 'value' => rawurlencode( + wp_json_encode( + array( + array( + 'id' => 'custom_html', + 'tag' => $match, + ), + ) + ) + ), + ); + } + } + + foreach ( $protected_blocks as $i => $block ) { + $base_content = str_replace( + sprintf( $placeholder_tpl, $i ), + $block, + $base_content + ); + } + + foreach ( $html_tags as $tag ) { + $converted_value .= wp_json_encode( + array( + array( + $tag, + ), + ) + ); + } + + if ( ! empty( $converted_value ) ) { + $base_content .= $converted_value; + } + + return $base_content; +} diff --git a/includes/views/js/import-metabox-edit.js b/includes/views/js/import-metabox-edit.js index 352c7567..a1b3a7de 100644 --- a/includes/views/js/import-metabox-edit.js +++ b/includes/views/js/import-metabox-edit.js @@ -869,13 +869,23 @@ typeof tagData.value === 'string' && decodeTagData !== tagData.value; let tagLabel = tagData.value; + let isCustomHTML = false; if (isEncoded) { decodeTagData = JSON.parse(decodeTagData); decodeTagData = decodeTagData[0] || {}; tagLabel = decodeTagData.tag.replaceAll('_', ' '); + isCustomHTML = 'custom_html' === decodeTagData.id; tagData['data-actions'] = tagData.value; tagData['data-field_id'] = 'fz-content-action-tags'; } + if ( isCustomHTML ) { + tagLabel = escapeText(tagLabel); + return ` + + ${tagLabel} + `; + } + return ` @@ -1050,6 +1060,29 @@ url.searchParams.delete('imported'); history.replaceState(history.state, '', url.href); } + + const tagify = mixContent.focus().data('tagify'); + + $(document).on('input', '.feedzy-post-content span', function () { + const tagElms = $(this).find('tag'); + tagElms.each((i, ele) => { + if ( $(ele).find('.feedzy-custom-tag').length ) { + const newValue = ele.innerText; + const data = tagify.getSetTagData(ele); + + let decodeTagData = decodeURIComponent(data.value); + decodeTagData = JSON.parse(decodeTagData); + decodeTagData = decodeTagData[0] || {}; + decodeTagData.tag = newValue; + + let encodeTagData = [ decodeTagData ]; + encodeTagData = JSON.stringify(encodeTagData, null, 0) + data.value = encodeURIComponent(encodeTagData); + + tagify.updateValueByDOMTags(); + } + }); + }); } function initSummary() { @@ -1539,3 +1572,16 @@ function initNewPostActions() { postTitle.select(); } } + +/** + * Escape the text. + */ +function escapeText( label ) { + return label + .trim() + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} \ No newline at end of file From 68170b61b904c7039fa340281797649d71eac19e Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Thu, 8 Jan 2026 11:41:48 +0530 Subject: [PATCH 11/27] fix: phpunit --- tests/test-import.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test-import.php b/tests/test-import.php index 00c2913b..fbbc4515 100644 --- a/tests/test-import.php +++ b/tests/test-import.php @@ -115,6 +115,9 @@ public function test_feedzy_imports( $random_name1, $random_name2, $urls, $magic $import_custom_fields = get_post_meta( $p->ID, 'imports_custom_fields', true ); $import_feed_limit = get_post_meta( $p->ID, 'import_feed_limit', true ); + // The import_post_content goes through escape_html_to_tag() which converts HTML tags to JSON format + $expected_content = escape_html_to_tag( $magic_tags ); + if ( $check_duplicate ) { $remove_duplicates = get_post_meta( $p->ID, 'import_remove_duplicates', true ); $mark_duplicate_tag = get_post_meta( $p->ID, 'mark_duplicate_tag', true ); @@ -128,7 +131,7 @@ public function test_feedzy_imports( $random_name1, $random_name2, $urls, $magic $this->assertEquals( '', $exc_key ); $this->assertEquals( '[#item_title]', $import_title ); $this->assertEquals( '[#item_date]', $import_date ); - $this->assertEquals( "{$magic_tags}", $import_content ); + $this->assertEquals( $expected_content, $import_content ); $this->assertEquals( '[#item_image]', $import_featured_img ); $this->assertEquals( '', $import_custom_fields ); $this->assertEquals( $num_items, $import_feed_limit ); From 22dd6815446ae57d0bb245e324d9dd9568439f68 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Tue, 10 Feb 2026 12:35:40 +0530 Subject: [PATCH 12/27] refactor: remove banner --- includes/admin/feedzy-rss-feeds-admin.php | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index 6d6ff973..85fc988e 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -88,10 +88,6 @@ function ( $product_name, $page_slug ) { return; } - if ( in_array( $page_slug, array( 'imports', 'categories' ), true ) ) { - $this->add_banner_anchor(); - } - if ( in_array( $page_slug, array( 'imports', 'new-category', 'settings' ), true ) && 'yes' === get_option( 'feedzy_rss_feeds_logger_flag', false ) @@ -2737,21 +2733,6 @@ public function get_survey_data() { return $survey_data; } - /** - * Add banner anchor for promotions. - * - * @return void - */ - public function add_banner_anchor() { - add_action( - 'admin_notices', - function () { - echo '
'; - }, - 999 - ); - } - /** * List of languages supported for translations. */ From 6a9c45af268c8c039cb30807293256cedf5861b5 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 13 Feb 2026 16:46:01 +0530 Subject: [PATCH 13/27] fix: handle feed limit for non-pro users --- includes/admin/feedzy-rss-feeds-import.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/admin/feedzy-rss-feeds-import.php b/includes/admin/feedzy-rss-feeds-import.php index 650315a6..f755183c 100644 --- a/includes/admin/feedzy-rss-feeds-import.php +++ b/includes/admin/feedzy-rss-feeds-import.php @@ -1614,7 +1614,7 @@ private function run_job( $job, $max ) { $import_featured_img = get_post_meta( $job->ID, 'import_post_featured_img', true ); $import_post_type = get_post_meta( $job->ID, 'import_post_type', true ); $import_post_term = get_post_meta( $job->ID, 'import_post_term', true ); - $import_feed_limit = get_post_meta( $job->ID, 'import_feed_limit', true ); + $import_feed_limit = feedzy_is_pro() ? get_post_meta( $job->ID, 'import_feed_limit', true ) : ''; $import_item_img_url = get_post_meta( $job->ID, 'import_use_external_image', true ); $import_remove_duplicates = get_post_meta( $job->ID, 'import_remove_duplicates', true ); $import_selected_language = get_post_meta( $job->ID, 'language', true ); From 057792811c2093bde232130dceb2b04f97cbf9ca Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 13 Feb 2026 17:34:07 +0530 Subject: [PATCH 14/27] fix: phpunit --- includes/admin/feedzy-rss-feeds-import.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/includes/admin/feedzy-rss-feeds-import.php b/includes/admin/feedzy-rss-feeds-import.php index f755183c..f7c7d9b7 100644 --- a/includes/admin/feedzy-rss-feeds-import.php +++ b/includes/admin/feedzy-rss-feeds-import.php @@ -1627,10 +1627,14 @@ private function run_job( $job, $max ) { $import_post_author = get_post_meta( $job->ID, 'import_post_author', true ); $mark_duplicate_tag = get_post_meta( $job->ID, 'mark_duplicate_tag', true ); $mark_duplicate_tag = feedzy_is_pro() && ! empty( $mark_duplicate_tag ) ? preg_replace( '/[\[\]#]/', '', $mark_duplicate_tag ) : ''; - $max = $import_feed_limit; + $import_max = $import_feed_limit; $import_remove_html = get_post_meta( $job->ID, 'import_remove_html', true ); $import_order = get_post_meta( $job->ID, 'import_order', true ); + if ( ! defined( 'TI_UNIT_TESTING' ) ) { + $max = $import_max; + } + Feedzy_Rss_Feeds_Log::info( 'Running import job: ' . $job->post_title . ' (ID: ' . $job->ID . ')', array( From 4fca68e598ff147b085bf8bfcf458550f2bd42f7 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Mon, 16 Feb 2026 12:20:03 +0530 Subject: [PATCH 15/27] add feedzy youtube videos to dashboard --- img/import-full-rss-posts.jpg | Bin 0 -> 21019 bytes img/jobs-from-rss.jpg | Bin 0 -> 15964 bytes img/rss-to-wordpress.jpg | Bin 0 -> 13255 bytes img/youtube-to-wordpress.jpg | Bin 0 -> 11512 bytes includes/layouts/feedzy-documentation.php | 50 ++++++++++++++++++++++ 5 files changed, 50 insertions(+) create mode 100644 img/import-full-rss-posts.jpg create mode 100644 img/jobs-from-rss.jpg create mode 100644 img/rss-to-wordpress.jpg create mode 100644 img/youtube-to-wordpress.jpg diff --git a/img/import-full-rss-posts.jpg b/img/import-full-rss-posts.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2a8ca029103ccd83f5c354d4597ae5940aec26d GIT binary patch literal 21019 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 CcG|B1 literal 0 HcmV?d00001 diff --git a/img/jobs-from-rss.jpg b/img/jobs-from-rss.jpg new file mode 100644 index 0000000000000000000000000000000000000000..145c11ac48ffcc3885ba2d15d1b4cc90489bf6dc GIT binary patch literal 15964 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 literal 0 HcmV?d00001 diff --git a/img/rss-to-wordpress.jpg b/img/rss-to-wordpress.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1e8546dab40fa3485d85bd971a74bc5e115ad44 GIT binary patch literal 13255 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 literal 0 HcmV?d00001 diff --git a/img/youtube-to-wordpress.jpg b/img/youtube-to-wordpress.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38c64c0093b89326d8c6c7f36b81986fcc7d8510 GIT binary patch literal 11512 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 UF&xtE7vNIBsCuF9_p +
  • +
    +
    + +
    +
    +

    +
    + +
    +
    +
    +
  • +
  • +
    +
    + +
    +
    +

    +
    + +
    +
    +
    +
  • +
    +
    + +
    +
    +

    +
    + +
    +
    +
    +
  • +
    +
    + +
    +
    +

    +
    + +
    +
    +
    +
  • From 238932bda88604a65b7b4860517602ffe9263637 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Tue, 24 Feb 2026 10:30:22 +0530 Subject: [PATCH 16/27] refactor: update CTA text --- includes/layouts/feedzy-documentation.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/includes/layouts/feedzy-documentation.php b/includes/layouts/feedzy-documentation.php index 7a53341d..82737838 100644 --- a/includes/layouts/feedzy-documentation.php +++ b/includes/layouts/feedzy-documentation.php @@ -100,7 +100,7 @@

    - +
    @@ -113,11 +113,12 @@

    - +
    -
  • +
  • +
  • @@ -125,11 +126,12 @@

    - +
    -
  • +
  • +
  • @@ -137,7 +139,7 @@

    - +
    From 1d7673ddabbd755d65957cb4b13313f7b8d8e825 Mon Sep 17 00:00:00 2001 From: Soare Robert Daniel Date: Wed, 25 Feb 2026 16:57:11 +0200 Subject: [PATCH 17/27] dev: add AGENTS.md (#1185) --- .distignore | 3 +- AGENTS.md | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 AGENTS.md diff --git a/.distignore b/.distignore index 4df8b2c2..d8134f3e 100755 --- a/.distignore +++ b/.distignore @@ -44,4 +44,5 @@ docker-compose.ci.yml artifacts phpstan.neon phpstan-baseline.neon -languages \ No newline at end of file +languages +AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..7381662b --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,107 @@ +# Agent workflow + +## Project Overview + +Feedzy RSS Feeds is a WordPress plugin (lite/free version) for RSS aggregation, content curation, and autoblogging. It supports importing RSS feeds as WordPress posts, displaying feeds via shortcodes/blocks/widgets, and integrates with Elementor. A separate Pro plugin extends its functionality. + +- **Text domain:** `feedzy-rss-feeds` +- **Min PHP:** 7.2 | **Min WP:** 6.0 +- **Main bootstrap:** `feedzy-rss-feed.php` (defines constants, registers autoloader, runs plugin) + +## Commands + +### Build & Dev (JS/Blocks) +```bash +npm install # Install JS dependencies +npm run build # Production build all blocks/JS bundles +npm run dev # Watch mode for all blocks (parallel) +npm run build:block # Build just the Gutenberg block +npm run build:loop # Build just the Loop block +``` + +### PHP Linting & Static Analysis +```bash +composer install # Install PHP dependencies +composer run lint # Run PHPCS (WordPress Coding Standards) +composer run format # Auto-fix PHPCS issues +composer run phpstan # Run PHPStan (level 6, includes/ only) +``` + +### PHPUnit Tests +```bash +# Requires WordPress test suite (MySQL service needed) +bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1:3306 +phpunit # Run all unit tests +phpunit tests/test-plugin.php # Run a single test file +``` + +### E2E Tests (Playwright + wp-env) +```bash +npm run wp-env start # Start Docker-based WordPress environment +npm run test:e2e # Run Playwright E2E tests +npm run test:e2e:debug # Run E2E with Playwright UI mode +``` + +### Other +```bash +npm run grunt # Run Grunt tasks (readme.txt → readme.md conversion, version bumping) +npm run dist # Build dist package (bin/dist.sh) +npm run lint:js # Lint JS files via wp-scripts +``` + +## Architecture + +### Autoloading Convention +The plugin uses a custom `spl_autoload_register` in the bootstrap file. Classes prefixed with `Feedzy_Rss_Feeds` are resolved by converting underscores to hyphens and lowering the case, then searching these directories in order: +1. `includes/` +2. `includes/abstract/` +3. `includes/admin/` +4. `includes/gutenberg/` +5. `includes/util/` +6. `includes/elementor/` + +Example: `Feedzy_Rss_Feeds_Admin` → `includes/admin/feedzy-rss-feeds-admin.php` + +### Core Class Hierarchy +- **`Feedzy_Rss_Feeds`** (`includes/feedzy-rss-feeds.php`) — Singleton core class. Loads dependencies and registers all hooks via the Loader pattern. +- **`Feedzy_Rss_Feeds_Loader`** (`includes/feedzy-rss-feeds-loader.php`) — Central hook registration (actions/filters stored in arrays, executed via `run()`). +- **`Feedzy_Rss_Feeds_Admin_Abstract`** (`includes/abstract/`) — Base class for admin functionality including feed fetching, shortcode rendering, and image handling. +- **`Feedzy_Rss_Feeds_Admin`** (`includes/admin/feedzy-rss-feeds-admin.php`) — Extends abstract. Handles admin UI, post types (`feedzy_categories`, `feedzy_imports`), REST routes, settings, shortcode `[feedzy-rss]`. +- **`Feedzy_Rss_Feeds_Import`** (`includes/admin/feedzy-rss-feeds-import.php`) — Feed-to-post import engine. Manages cron jobs, import post type metaboxes, magic tags. + +### Custom Post Types +- `feedzy_categories` — Groups of feed URLs for reuse. +- `feedzy_imports` — Import job configurations (feed source → WordPress posts). + +### JavaScript / Block Architecture +Blocks are built with `@wordpress/scripts`. Each has its own entry point under `js/`: +- `js/FeedzyBlock/` → `build/block/` — Main Gutenberg block for displaying feeds +- `js/FeedzyLoop/` → `build/loop/` — Loop block variant +- `js/Onboarding/` → `build/onboarding/` — Setup wizard +- `js/ActionPopup/` → `build/action-popup/` — Action chain popup +- `js/Conditions/` → `build/conditions/` — Import filter conditions UI +- `js/FeedBack/` → `build/feedback/` — Feedback prompt +- `js/Review/` → `build/review/` — Review prompt + +Legacy JS files (non-bundled) in `js/` root: TinyMCE integration, Elementor widget, lazy loading, settings, categories. + +### Pro Plugin Integration +The lite plugin checks for Pro via `feedzy_is_pro()` and `FEEDZY_PRO_BASEFILE` / `FEEDZY_PRO_ABSPATH` constants. Many hooks have `feedzy_` prefixed filters that Pro extends. The import feature conditionally loads based on `feedzy_is_pro(false)` or `has_filter('feedzy_free_has_import')`. + +### Key WordPress Hooks +- Shortcode: `[feedzy-rss]` registered in `define_admin_hooks()` +- REST API: routes registered via `rest_route` on `rest_api_init` +- Cron: `feedzy_cron` action drives scheduled imports +- Logging: `feedzy_log` action → `Feedzy_Rss_Feeds_Log` class + +### Tests +- **PHPUnit tests:** `tests/test-*.php` files (prefixed with `test-`), bootstrapped by `tests/bootstrap.php`. Require WP test suite installation. +- **E2E tests:** `tests/e2e/specs/*.spec.js` using Playwright with `@wordpress/e2e-test-utils-playwright`. Run against `wp-env` Docker environment. +- **PHPStan stubs:** `tests/php/static-analysis-stubs/` provides type stubs for static analysis. + +## Coding Standards + +- Follows WordPress Coding Standards enforced via PHPCS (`phpcs.xml`) +- WordPress-VIP-Go rules included +- PHPStan level 6 for `includes/` directory +- JS linting via `@wordpress/eslint-plugin` From 7ea4af4b99a37e6f32b83936f0cd1c2c8127560b Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Tue, 17 Mar 2026 17:25:24 +0530 Subject: [PATCH 18/27] fix: make header user agent filter compatible with WP --- includes/abstract/feedzy-rss-feeds-admin-abstract.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/abstract/feedzy-rss-feeds-admin-abstract.php b/includes/abstract/feedzy-rss-feeds-admin-abstract.php index 2cc5d0a4..e1caa7ad 100644 --- a/includes/abstract/feedzy-rss-feeds-admin-abstract.php +++ b/includes/abstract/feedzy-rss-feeds-admin-abstract.php @@ -860,7 +860,7 @@ private function init_feed( $feed_url, $cache, $sc, $allow_https = FEEDZY_ALLOW_ $feed->set_file_class( 'WP_SimplePie_File' ); $default_agent = $this->get_default_user_agent( $feed_url ); - $feed->set_useragent( apply_filters( 'http_headers_useragent', $default_agent ) ); + $feed->set_useragent( apply_filters( 'http_headers_useragent', $default_agent, is_array( $feed_url ) ? reset( $feed_url ) : $feed_url ) ); if ( false === apply_filters( 'feedzy_disable_db_cache', false, $feed_url ) ) { SimplePie_Cache::register( 'wp_transient', 'WP_Feed_Cache_Transient' ); $feed->set_cache_location( 'wp_transient' ); @@ -917,7 +917,7 @@ function ( $time ) use ( $cache_time ) { if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) { // phpcs:ignore WordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___SERVER__HTTP_USER_AGENT__ $set_server_agent = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) . SIMPLEPIE_USERAGENT ); - $feed->set_useragent( apply_filters( 'http_headers_useragent', $set_server_agent ) ); + $feed->set_useragent( apply_filters( 'http_headers_useragent', $set_server_agent, is_array( $feed_url ) ? reset( $feed_url ) : $feed_url ) ); } $feed->init(); From d153ac72e2a66e52edb0d5d6acc3f248a6cfd687 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Tue, 17 Mar 2026 17:32:31 +0530 Subject: [PATCH 19/27] fix: phpstan --- .../abstract/feedzy-rss-feeds-admin-abstract.php | 8 ++++---- phpstan-baseline.neon | 14 ++------------ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/includes/abstract/feedzy-rss-feeds-admin-abstract.php b/includes/abstract/feedzy-rss-feeds-admin-abstract.php index e1caa7ad..94930f2f 100644 --- a/includes/abstract/feedzy-rss-feeds-admin-abstract.php +++ b/includes/abstract/feedzy-rss-feeds-admin-abstract.php @@ -822,10 +822,10 @@ function ( $url ) { * @since 3.1.7 * @access private * - * @param string $feed_url The feed URL. - * @param string $cache The cache string (eg. 1_hour, 30_min etc.). - * @param array $sc The shortcode attributes. - * @param bool $allow_https Defaults to constant FEEDZY_ALLOW_HTTPS. + * @param string|array $feed_url The feed URL. + * @param string $cache The cache string (eg. 1_hour, 30_min etc.). + * @param array $sc The shortcode attributes. + * @param bool $allow_https Defaults to constant FEEDZY_ALLOW_HTTPS. * * @return SimplePie */ diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index ff225c74..aacfeddb 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -270,11 +270,6 @@ parameters: count: 1 path: includes/abstract/feedzy-rss-feeds-admin-abstract.php - - - message: "#^Parameter \\#1 \\$feed_url of method Feedzy_Rss_Feeds_Admin_Abstract\\:\\:init_feed\\(\\) expects string, array given\\.$#" - count: 2 - path: includes/abstract/feedzy-rss-feeds-admin-abstract.php - - message: "#^Parameter \\#1 \\$text of function esc_attr expects string, int\\<0, max\\>\\|false given\\.$#" count: 1 @@ -297,17 +292,12 @@ parameters: - message: "#^Result of && is always false\\.$#" - count: 4 + count: 2 path: includes/abstract/feedzy-rss-feeds-admin-abstract.php - message: "#^Result of \\|\\| is always true\\.$#" - count: 3 - path: includes/abstract/feedzy-rss-feeds-admin-abstract.php - - - - message: "#^Strict comparison using \\=\\=\\= between 1 and \\*NEVER\\* will always evaluate to false\\.$#" - count: 2 + count: 1 path: includes/abstract/feedzy-rss-feeds-admin-abstract.php - From 08d1aaa7dd6839fcc673710b7850aa0841e98575 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Mon, 1 Dec 2025 11:42:45 +0530 Subject: [PATCH 20/27] refactor: translatable strings --- css/settings.css | 3 - feedzy-rss-feed.php | 29 +++++++++ includes/admin/feedzy-rss-feeds-admin.php | 2 +- includes/admin/feedzy-rss-feeds-import.php | 62 +++++++++++++++---- includes/admin/feedzy-rss-feeds-ui-lang.php | 30 +++------ includes/admin/feedzy-rss-feeds-ui.php | 2 +- .../elementor/widgets/register-widget.php | 6 +- includes/layouts/feedzy-improve.php | 5 +- includes/layouts/feedzy-pro.php | 45 +++++++------- includes/layouts/feedzy-schedules.php | 6 +- includes/layouts/setup-wizard.php | 15 +++-- .../views/amazon-product-advertising-view.php | 2 +- includes/views/import-metabox-edit.php | 27 +++++--- includes/views/openai-view.php | 2 +- includes/views/openrouter-view.php | 2 +- includes/views/spinnerchief-view.php | 2 +- includes/views/wordai-view.php | 4 +- js/FeedzyBlock/Editor.js | 56 +++++++++++------ js/FeedzyBlock/inspector.js | 62 ++++++++++--------- js/FeedzyLoop/controls.js | 38 +++++++----- js/FeedzyLoop/placeholder.js | 28 +++++---- readme.txt | 6 +- 22 files changed, 268 insertions(+), 166 deletions(-) diff --git a/css/settings.css b/css/settings.css index f4a89a5d..a06db830 100644 --- a/css/settings.css +++ b/css/settings.css @@ -835,7 +835,6 @@ input.fz-switch-toggle[type=checkbox]:checked:before{ outline: 0; cursor: pointer; text-decoration: none; - text-transform: capitalize; -webkit-transition: all 0.3s ease-in-out; -moz-transition: all 0.3s ease-in-out; -o-transition: all 0.3s ease-in-out; @@ -1564,7 +1563,6 @@ input.fz-switch-toggle[type=checkbox]:checked:before{ background: transparent; border-color: #4268CF; color: #4268CF; - text-transform: capitalize; -webkit-transition: all 0.3s ease-in-out; -moz-transition: all 0.3s ease-in-out; -o-transition: all 0.3s ease-in-out; @@ -2250,7 +2248,6 @@ li.draggable-item .components-panel__body-toggle.components-button{ } .fz-content-action div .tagify__tag-text { padding-right: 10px; - text-transform: capitalize; } .popover-action-list ul li.fz-action-disabled { cursor: not-allowed !important; diff --git a/feedzy-rss-feed.php b/feedzy-rss-feed.php index 63ca97ce..77839ee4 100644 --- a/feedzy-rss-feed.php +++ b/feedzy-rss-feed.php @@ -324,6 +324,35 @@ function ( $labels ) { ); } + if ( isset( $labels['about_us'] ) ) { + $labels['about_us'] = array_merge( + $labels['about_us'], + array( + 'title' => __( 'About Us', 'feedzy-rss-feeds' ), + 'heroHeader' => __( 'Our Story', 'feedzy-rss-feeds' ), + 'heroTextFirst' => __( 'Themeisle was founded in 2012 by a group of passionate developers who wanted to create beautiful and functional WordPress themes and plugins. Since then, we have grown into a team of over 20 dedicated professionals who are committed to delivering the best possible products to our customers.', 'feedzy-rss-feeds' ), + 'heroTextSecond' => __( 'At Themeisle, we offer a wide range of WordPress themes and plugins that are designed to meet the needs of both beginners and advanced users. Our products are feature-rich, easy to use, and are designed to help you create beautiful and functional websites.', 'feedzy-rss-feeds' ), + 'teamImageCaption' => __( 'Our team in WCEU2022 in Portugal', 'feedzy-rss-feeds' ), + 'newsHeading' => __( 'Stay connected for news & updates!', 'feedzy-rss-feeds' ), + 'emailPlaceholder' => __( 'Your email address', 'feedzy-rss-feeds' ), + 'signMeUp' => __( 'Sign me up', 'feedzy-rss-feeds' ), + 'installNow' => __( 'Install Now', 'feedzy-rss-feeds' ), + 'activate' => __( 'Activate', 'feedzy-rss-feeds' ), + 'learnMore' => __( 'Learn More', 'feedzy-rss-feeds' ), + 'installed' => __( 'Installed', 'feedzy-rss-feeds' ), + 'notInstalled' => __( 'Not Installed', 'feedzy-rss-feeds' ), + 'active' => __( 'Active', 'feedzy-rss-feeds' ), + 'others' => array( + 'optimole_desc' => __( 'Optimole is an image optimization service that automatically optimizes your images and serves them to your visitors via a global CDN, making your website lighter, faster and helping you reduce your bandwidth usage.', 'feedzy-rss-feeds' ), + 'neve_desc' => __( 'A fast, lightweight, customizable WordPress theme offering responsive design, speed, and flexibility for various website types.', 'feedzy-rss-feeds' ), + 'landingkit_desc' => __( 'Turn WordPress into a landing page powerhouse with Landing Kit, map domains to pages or any other published resource.', 'feedzy-rss-feeds' ), + 'sparks_desc' => __( 'Extend your store functionality with 8 ultra-performant features like product comparisons, variation swatches, wishlist, and more.', 'feedzy-rss-feeds' ), + 'tpc_desc' => __( 'Design, save, and revisit your templates anytime with your personal vault on Templates Cloud.', 'feedzy-rss-feeds' ), + ), + ) + ); + } + return $labels; } ); diff --git a/includes/admin/feedzy-rss-feeds-admin.php b/includes/admin/feedzy-rss-feeds-admin.php index 6d6ff973..51b2cb01 100644 --- a/includes/admin/feedzy-rss-feeds-admin.php +++ b/includes/admin/feedzy-rss-feeds-admin.php @@ -950,7 +950,7 @@ public function feedzy_category_feed() { ' . sprintf( // translators: %1$s and %2$s are placeholders for HTML anchor tags. - __( 'Please be aware that multiple feeds, when mashed together, may sometimes not work as expected as explained %1$s here %2$s.', 'feedzy-rss-feeds' ), + __( 'Please be aware that multiple feeds, when mashed together, may sometimes not work as expected as explained %1$shere%2$s.', 'feedzy-rss-feeds' ), '', '' ) diff --git a/includes/admin/feedzy-rss-feeds-import.php b/includes/admin/feedzy-rss-feeds-import.php index 650315a6..fb0599c5 100644 --- a/includes/admin/feedzy-rss-feeds-import.php +++ b/includes/admin/feedzy-rss-feeds-import.php @@ -105,8 +105,12 @@ public function upsell_content( $content, $area, $location ) {
    - ' . __( 'This feature is available in the Pro version. Unlock more features, by', 'feedzy-rss-feeds' ) . ' - ' . __( 'upgrading to Feedzy Pro', 'feedzy-rss-feeds' ) . ' + ' . sprintf( + // translators: %1$s and %2$s are HTML tags for the link to the upsell URL. + __( 'This feature is available in the Pro version. Unlock more features, by %1$supgrading to Feedzy Pro%2$s', 'feedzy-rss-feeds' ), + '', + '' + ) . '
    '; @@ -434,9 +438,18 @@ public function feedzy_import_feed_options() { 'posts_per_page' => 100, ); $feed_categories = get_posts( $args ); - $post_types = get_post_types( '', 'names' ); - $post_types = array_diff( $post_types, array( 'feedzy_imports', 'feedzy_categories' ) ); - $published_status = array( 'publish', 'draft' ); + $post_types = get_post_types( '', 'object' ); + $post_types = array_diff_key( + $post_types, + array( + 'feedzy_imports' => array(), + 'feedzy_categories' => array(), + ) + ); + $published_status = array( + 'publish' => __( 'Publish', 'feedzy-rss-feeds' ), + 'draft' => __( 'Draft', 'feedzy-rss-feeds' ), + ); $authors = get_users( array( 'number' => 100 ) ); $authors_array = array(); @@ -929,11 +942,27 @@ public function manage_feedzy_import_columns( $column, $post_id ) { $then = new DateTime(); $then = $then->setTimestamp( $last ); $in = $now->diff( $then ); - $msg = sprintf( - // translators: %1$d: number of hours, %2$d: number of minutes. - __( 'Ran %1$d hours %2$d minutes ago', 'feedzy-rss-feeds' ), - $in->format( '%h' ), - $in->format( '%i' ) + + $hours = (int) $in->format( '%h' ); + $minutes = (int) $in->format( '%i' ); + + $hours_text = sprintf( + // translators: %d: number of hours. + _n( '%d hour', '%d hours', $hours, 'feedzy-rss-feeds' ), + $hours + ); + + $minutes_text = sprintf( + // translators: %d: number of minutes. + _n( '%d minute', '%d minutes', $minutes, 'feedzy-rss-feeds' ), + $minutes + ); + + $msg = sprintf( + // translators: %1$s: hours text, %2$s: minutes text. + __( 'Ran %1$s %2$s ago', 'feedzy-rss-feeds' ), + $hours_text, + $minutes_text ); } @@ -2724,7 +2753,12 @@ function ( $term ) { Feedzy_Rss_Feeds_Log::error( sprintf( // translators: %1$d is the number of items without images, %2$d is the total number of items imported. - __( 'Unable to find an image for %1$d out of %2$d items imported', 'feedzy-rss-feeds' ), + _n( + 'Unable to find an image for %1$d out of %2$d item imported', + 'Unable to find an image for %1$d out of %2$d items imported', + $count, + 'feedzy-rss-feeds' + ), $import_image_errors, $count ), @@ -3663,7 +3697,11 @@ public function add_import_actions( $actions, $post ) { } elseif ( 1 === intval( get_post_meta( $post->ID, 'feedzy', true ) ) ) { // show an unclickable action that mentions that it is imported by us so that users are aware. $feedzy_job_id = get_post_meta( $post->ID, 'feedzy_job', true ); - $actions['feedzy'] = sprintf( '(%s %s)', __( 'Imported by Feedzy from', 'feedzy-rss-feeds' ), get_the_title( $feedzy_job_id ) ); + $actions['feedzy'] = sprintf( + // translators: %s is the title of job. + __( 'Imported by Feedzy from %s', 'feedzy-rss-feeds' ), + get_the_title( $feedzy_job_id ) + ); } return $actions; diff --git a/includes/admin/feedzy-rss-feeds-ui-lang.php b/includes/admin/feedzy-rss-feeds-ui-lang.php index f3396e1b..7860737d 100644 --- a/includes/admin/feedzy-rss-feeds-ui-lang.php +++ b/includes/admin/feedzy-rss-feeds-ui-lang.php @@ -90,12 +90,8 @@ public static function get_form_defaults() { */ public static function get_form_elements() { $meta = sprintf( - // translators: 1: tag for author, 2: closing tag, 3: tag for date, 4: closing tag, 5: tag for time, 6: closing tag, 7: tag for documentation link, 8: closing tag. - __( 'Should we display additional meta fields out of %1$s author %2$s, %3$s date %4$s and %5$s time %6$s? (comma-separated list, in order of display). View documentation %7$s here %8$s.', 'feedzy-rss-feeds' ), - '', - '', - '', - '', + // translators: 1: tag for author, 2: closing tag, 3: tag for documentation link, 4: closing tag. + __( 'Should we display additional meta fields out of %1$sauthor%2$s, %3$sdate%4$s and %5$stime%6$s? (comma-separated list, in order of display). View documentation %3$shere%4$s.', 'feedzy-rss-feeds' ), '', '', '', @@ -103,14 +99,8 @@ public static function get_form_elements() { ); if ( has_filter( 'feedzy_retrieve_categories' ) ) { $meta = sprintf( - // translators: 1: tag for author, 2: closing tag, 3: tag for date, 4: closing tag, 5: tag for time, 6: closing tag, 7: tag for categories, 8: closing tag, 9: tag for documentation link, 10: closing tag. - __( 'Should we display additional meta fields out of %1$s author%2$s, %3$s date%4$s, %5$s time %6$s and %7$s categories %8$s? (comma-separated list). View documentation %9$s here %10$s.', 'feedzy-rss-feeds' ), - '', - '', - '', - '', - '', - '', + // translators: %1$s is tag, %2$s is closing tag, %3$s is tag for documentation link, %4$s: closing tag. + __( 'Should we display additional meta fields out of %1$sauthor%2$s, %1$sdate%2$s, %1$stime%2$s and %1$scategories%2$s? (comma-separated list). View documentation %3$shere%4$s.', 'feedzy-rss-feeds' ), '', '', '', @@ -120,7 +110,7 @@ public static function get_form_elements() { $multiple = sprintf( // translators: 1: tag for source, 2: closing tag. - __( 'When using multiple sources, should we display additional meta fields? %1$s source %2$s (feed title).', 'feedzy-rss-feeds' ), + __( 'When using multiple sources, should we display additional meta fields?%1$ssource%2$s(feed title).', 'feedzy-rss-feeds' ), '', '' ); @@ -134,7 +124,7 @@ public static function get_form_elements() { __( 'The feed(s) URL (comma-separated list).', 'feedzy-rss-feeds' ) . ' ' . sprintf( // translators: 1: tag opening, 2: tag closing. - __( 'Click %1$s here %2$s to check if feed is valid.', 'feedzy-rss-feeds' ), + __( 'Click %1$shere%2$s to check if feed is valid.', 'feedzy-rss-feeds' ), '', '' ) @@ -484,12 +474,12 @@ public static function get_form_elements() { ), 'section_pro' => array( 'title' => __( 'PRO Options', 'feedzy-rss-feeds' ), - 'description' => __( 'Get access to more options and customizations with full version of Feedzy RSS Feeds . Use existing templates or extend them and make them your own.', 'feedzy-rss-feeds' ) . '
    ' . __( 'See more features of Feedzy RSS Feeds PRO', 'feedzy-rss-feeds' ) . '', + 'description' => __( 'Get access to more options and customizations with full version of Feedzy RSS Feeds. Use existing templates or extend them and make them your own.', 'feedzy-rss-feeds' ) . '
    ' . __( 'See more features of Feedzy RSS Feeds PRO', 'feedzy-rss-feeds' ) . '', 'elements' => array( 'price' => array( 'label' => sprintf( // translators: 1:
    tag, 2: tag opening, 3: tag closing. - __( 'Should we display the price from the feed if it is available? %1$s You can read about how to extract price from a custom tag %2$s here %3$s', 'feedzy-rss-feeds' ), + __( 'Should we display the price from the feed if it is available?%1$sYou can read about how to extract price from a custom tag %2$shere%3$s', 'feedzy-rss-feeds' ), '
    ', '', '' @@ -511,7 +501,7 @@ public static function get_form_elements() { 'referral_url' => array( 'label' => sprintf( // translators: 1: tag opening, 2: tag closing. - __( 'Referral URL parameters as per %1$s this document here %2$s', 'feedzy-rss-feeds' ), + __( 'Referral URL parameters as per %1$sthis document here%2$s', 'feedzy-rss-feeds' ), '', '' ), @@ -531,7 +521,7 @@ public static function get_form_elements() { 'mapping' => array( 'label' => sprintf( // translators: 1: tag opening, 2: tag closing. - __( 'Provide mapping for custom feed elements as per %1$s this document here %2$s. This will only work for single feeds, not comma-separated feeds.', 'feedzy-rss-feeds' ), + __( 'Provide mapping for custom feed elements as per %1$sthis document here%2$s. This will only work for single feeds, not comma-separated feeds.', 'feedzy-rss-feeds' ), '', '' ), diff --git a/includes/admin/feedzy-rss-feeds-ui.php b/includes/admin/feedzy-rss-feeds-ui.php index aa02b874..e1ae6d61 100644 --- a/includes/admin/feedzy-rss-feeds-ui.php +++ b/includes/admin/feedzy-rss-feeds-ui.php @@ -238,7 +238,7 @@ public function feedzy_import_post_title_section() { $content = __( 'You are using Feedzy Lite.', 'feedzy-rss-feeds' ) . ' '; // translators: %1$s: opening anchor tag, %2$s: closing anchor tag. - $content .= wp_sprintf( __( 'Unlock more powerful features, by %1$s upgrading to Feedzy Pro %2$s and get 50%% off.', 'feedzy-rss-feeds' ), '', '' ); + $content .= wp_sprintf( __( 'Unlock more powerful features, by %1$supgrading to Feedzy Pro%2$s and get 50%% off.', 'feedzy-rss-feeds' ), '', '' ); echo wp_kses_post( $content ); ?> diff --git a/includes/elementor/widgets/register-widget.php b/includes/elementor/widgets/register-widget.php index 745e7cc4..3abfd707 100644 --- a/includes/elementor/widgets/register-widget.php +++ b/includes/elementor/widgets/register-widget.php @@ -106,7 +106,7 @@ protected function register_controls() { // phpcs:ignore PSR2.Methods.MethodDecl 'type' => Controls_Manager::TEXTAREA, 'description' => wp_sprintf( // translators: %1$s: opening anchor tag, %2$s: closing anchor tag. - __( 'You can add multiple sources at once, by separating them with commas. %1$s Click here %2$s to check if the feed is valid. Invalid feeds may not import anything.', 'feedzy-rss-feeds' ), + __( 'You can add multiple sources at once, by separating them with commas. %1$sClick here%2$s to check if the feed is valid. Invalid feeds may not import anything.', 'feedzy-rss-feeds' ), '', '' ), @@ -505,7 +505,7 @@ protected function register_controls() { // phpcs:ignore PSR2.Methods.MethodDecl 'description' => wp_sprintf( // translators: %1$s: opening anchor tag, %2$s: closing anchor tag. __( - 'Learn more about this feature in %1$s Feedzy docs %2$s .', + 'Learn more about this feature in %1$sFeedzy docs%2$s.', 'feedzy-rss-feeds' ), '', @@ -572,7 +572,7 @@ protected function register_controls() { // phpcs:ignore PSR2.Methods.MethodDecl ! feedzy_is_pro() ? wp_sprintf( // translators: %1$s: opening anchor tag, %2$s: closing anchor tag. - __( 'Unlock this feature and more advanced options with %1$s Feedzy Pro %1$s.', 'feedzy-rss-feeds' ), + __( 'Unlock this feature and more advanced options with %1$sFeedzy Pro%2$s.', 'feedzy-rss-feeds' ), '', '' ) diff --git a/includes/layouts/feedzy-improve.php b/includes/layouts/feedzy-improve.php index 97dc10bf..7bb3e607 100644 --- a/includes/layouts/feedzy-improve.php +++ b/includes/layouts/feedzy-improve.php @@ -8,9 +8,10 @@

    diff --git a/includes/layouts/feedzy-pro.php b/includes/layouts/feedzy-pro.php index 296b95d4..072dfa9f 100644 --- a/includes/layouts/feedzy-pro.php +++ b/includes/layouts/feedzy-pro.php @@ -14,10 +14,10 @@

  • -
  • +
  • -
  • +
  • @@ -27,10 +27,10 @@

    -
  • +
  • -
  • +
  • @@ -41,10 +41,10 @@

    -
  • +
  • -
  • +
  • @@ -57,10 +57,10 @@

    -
  • +
  • -
  • +
  • @@ -74,10 +74,10 @@

    -
  • +
  • -
  • +
  • @@ -89,13 +89,13 @@

    - +

    -
  • +
  • -
  • +
  • @@ -109,10 +109,10 @@

    -
  • +
  • -
  • +
  • @@ -126,15 +126,14 @@

    -
  • +
  • -
  • +
  • @@ -156,10 +155,10 @@ ?>

    -
  • +
  • -
  • +
  • @@ -173,10 +172,10 @@

    -
  • +
  • -
  • +
  • diff --git a/includes/layouts/feedzy-schedules.php b/includes/layouts/feedzy-schedules.php index 3ef5a699..a3662141 100644 --- a/includes/layouts/feedzy-schedules.php +++ b/includes/layouts/feedzy-schedules.php @@ -40,7 +40,7 @@ class="form-control" type="text" class="form-control" id="fz-schedule-display" - placeholder="Once Hourly" + placeholder= /> @@ -53,7 +53,7 @@ class="form-control" type="text" class="form-control" id="fz-schedule-name" - placeholder="hourly" + placeholder= /> @@ -83,7 +83,7 @@ class="fz-schedules-table" $schedule_count = count( $custom_schedules ); // translators: %s is the number of custom schedules. - echo esc_html( sprintf( __( '%s items', 'feedzy-rss-feeds' ), $schedule_count ) ); + echo esc_html( sprintf( _n( '%d item', '%d items', $schedule_count, 'feedzy-rss-feeds' ) ) ); ?> diff --git a/includes/layouts/setup-wizard.php b/includes/layouts/setup-wizard.php index 8d61f8c5..2e9efc88 100644 --- a/includes/layouts/setup-wizard.php +++ b/includes/layouts/setup-wizard.php @@ -22,7 +22,10 @@ $wizard_data = get_option( 'feedzy_wizard_data', array() ); $feed_source = ! empty( $wizard_data['feed'] ) ? $wizard_data['feed'] : ''; } -$published_status = array( 'publish', 'draft' ); +$published_status = array( + 'publish' => __( 'Publish', 'feedzy-rss-feeds' ), + 'draft' => __( 'Draft', 'feedzy-rss-feeds' ), +); add_thickbox(); ?> @@ -86,7 +89,7 @@