Skip to content Skip to sidebar

This is the technical support forum for WPML - the multilingual WordPress plugin.

Everyone can read, but only WPML clients can post here. WPML team is replying on the forum 6 days per week, 22 hours per day.

Sun Mon Tue Wed Thu Fri Sat
- 8:00 – 14:00 8:00 – 14:00 8:00 – 14:00 8:00 – 14:00 8:00 – 14:00 -
- 15:00 – 17:00 15:00 – 17:00 15:00 – 17:00 15:00 – 17:00 15:00 – 17:00 -

Supporter timezone: Europe/Madrid (GMT+02:00)

Tagged: 

This topic contains 3 replies, has 0 voices.

Last updated by Paola Mendiburu 2 weeks, 6 days ago.

Assisted by: Paola Mendiburu.

Author Posts
April 3, 2026 at 8:46 pm #17948582

caleri-patrizia-s.r.l.C

Hello,

I am reopening this topic with a related but more advanced issue.

Previous context (summary)

In a previous ticket, we confirmed that:

Stock updates performed via an external connector (BindCommerce) update the WooCommerce database directly
These updates do not trigger WordPress/WooCommerce hooks (e.g. save_post)
As a result, WPML does not synchronize stock between original (IT) and translated (DE) products unless a product update is triggered manually or programmatically

We have already understood and accepted this behavior.

Current situation

We are now using a setup where:

Stock is updated externally for both IT and DE products
Stock values are correctly aligned between languages
Synchronization itself is no longer the issue
New problem (critical)

We are now experiencing a serious issue with WPML Translation Management.

After repeated automated updates (stock/price only), the table:

wp_icl_translation_status

starts accumulating a large number of entries with:

translation_service = 0
translator_id = 0

These appear to be invalid or orphan translation jobs.

Over time, this leads to:

thousands of entries in the translation queue
eventual fatal error when opening WPML → Translation Management (Jobs page)
Key observation

These updates:

do NOT involve any content translation
only update stock/price meta fields
should not logically generate translation jobs

However, WPML still creates entries in the translation queue.

Questions
Why does WPML create translation jobs for stock/meta updates only?
Is this behavior expected or considered a bug?
Is there a way to prevent WPML from generating translation jobs for stock/price updates?
What is the recommended approach to update translated products (stock only) without polluting the translation queue?
Is there a safe way to prevent or clean the accumulation of these invalid jobs?
Additional notes
Manual product updates from WooCommerce backend do NOT cause this issue
The problem only appears with frequent automated updates
The main concern is now maintaining a stable and usable Translation Management system

If needed, I can provide database samples or additional logs.

Thank you for your support.

April 7, 2026 at 8:32 am #17953014

Paola Mendiburu
WPML Supporter since 11/2020

Languages: English (English ) Spanish (Español ) Italian (Italiano )

Timezone: Europe/Madrid (GMT+02:00)

Hi there!

This is Paola and I hope you are well!

To find out the details of the error you are getting, could you do the following?
- Access the wp-config.php file (located in the WordPress root).
- Insert these lines just before /* That's all, stop editing! Happy blogging. */

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

Please reproduce the issue, then access the debug log here: /wp-content/debug.log and copy and paste the information into your next reply.
More info: https://wordpress.org/support/article/debugging-in-wordpress/

Having this report will help us find the root of the problem.

April 7, 2026 at 9:15 pm #17955206

caleri-patrizia-s.r.l.C

Hello,

thank you for your response.

We have carefully analyzed the issue and we would like to provide a clearer technical explanation of what is happening on our side.

---

### 1. About the debug.log

The debug log does not contain a clear or direct fatal error related to this issue.

The nature of the problem is instead identified through the WordPress critical error email we receive, which is triggered when WPML tries to process translation jobs.

As following a past-copy of the mail received after the critical error:

"Un errore di E_ERROR è stato causato nella linea 86 del file /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/translation-proxy/class-wpml-translation-proxy-networking.php. Messaggio di errore: Uncaught WPMLTranslationProxyApiException: (100) A general error occurred. It could be a temporary issue.
Please try again after a few minutes.
If problem persists please visit our support forum for help.
in /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/translation-proxy/class-wpml-translation-proxy-networking.php:86
Stack trace:
#0 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/inc/translation-proxy/translationproxy-api.class.php(24): WPML_Translation_Proxy_Networking->send_request()
#1 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/inc/translation-proxy/translationproxy-service.class.php(48): TranslationProxy_Api::proxy_request()
#2 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/API/REST/jobs/class-wpml-tm-rest-jobs-translation-service.php(29): TranslationProxy_Service::get_service()
#3 [internal function]: WPML_TM_Rest_Jobs_Translation_Service->{closure}()
#4 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/wp/classes/Cache.php(50): call_user_func_array()
#5 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/API/REST/jobs/class-wpml-tm-rest-jobs-translation-service.php(35): WPML\LIB\WP\Cache::WPML\LIB\WP\{closure}()
#6 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/API/REST/jobs/class-wpml-tm-rest-jobs-translation-service.php(12): WPML_TM_Rest_Jobs_Translation_Service->get_translation_service()
#7 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/menu/jobs-list/class-wpml-tm-jobs-list-services.php(45): WPML_TM_Rest_Jobs_Translation_Service->get_name()
#8 [internal function]: WPML_TM_Jobs_List_Services->map()
#9 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/menu/jobs-list/class-wpml-tm-jobs-list-services.php(36): array_map()
#10 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/menu/jobs-list/class-wpml-tm-jobs-list-translated_by_filters.php(30): WPML_TM_Jobs_List_Services->get()
#11 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/menu/jobs-list/class-wpml-tm-jobs-list-script-data.php(110): WPML_TM_Jobs_List_Translated_By_Filters->get()
#12 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/classes/jobs/Loader.php(36): WPML_TM_Jobs_List_Script_Data->get()
#13 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/Either.php(207): WPML\TM\Jobs\Loader->getData()
#14 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/Either.php(257): WPML\FP\Right->map()
#15 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/Promise.php(24): WPML\FP\Right->chain()
#16 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/Promise.php(30): WPML\FP\Promise->resolve()
#17 /home/strikecalz/webapps/strikecalz/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/wp/classes/Hooks.php(50): WPML\FP\Promise->resolve()
#18 /home/strikecalz/webapps/strikecalz/wp-includes/class-wp-hook.php(324): WPML\LIB\WP\Hooks::WPML\LIB\WP\{closure}()
#19 /home/strikecalz/webapps/strikecalz/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters()
#20 /home/strikecalz/webapps/strikecalz/wp-includes/plugin.php(517): WP_Hook->do_action()
#21 /home/strikecalz/webapps/strikecalz/wp-settings.php(749): do_action()
#22 /home/strikecalz/webapps/strikecalz/wp-config.php(90): require_once('...')
#23 /home/strikecalz/webapps/strikecalz/wp-load.php(50): require_once('...')
#24 /home/strikecalz/webapps/strikecalz/wp-admin/admin.php(35): require_once('...')
#25 {main}
thrown

---

### 2. Observed issue

We identified that the problem is related to specific records in the table:

`wp_icl_translation_status`

In particular, problematic rows have:

* `translation_service = 0`
* `translator_id = 0`

These entries appear to be **invalid or orphan translation jobs**.

We are attaching a screenshot showing this situation.

---

### 3. Key finding (important)

We discovered a very precise pattern:

All the affected records are linked to products that:

* were already translated in the past (Italian → German)
* were NOT manually sent again for translation
* were recently updated ONLY in stock quantity

These stock updates are performed automatically by an external connector (**BindCommerce**).

So:

* no content changes
* no translation actions triggered manually
* only stock updates

Despite this, WPML seems to:

* generate new entries in `wp_icl_translation_status`
* assign `translator_id = 0`
* eventually trigger a critical error

This suggests that WPML is incorrectly creating translation jobs during stock updates.

---

### 4. Temporary workaround (our fix)

To restore functionality, we currently have to manually clean these corrupted entries via MySQL.

Below are the queries we use.

---

#### Identify problematic entries

```sql
SELECT translation_id, status, translation_service, translator_id
FROM wp_icl_translation_status
ORDER BY translation_id DESC
LIMIT 50;
```

Problematic rows are those with:

* `translation_service = 0`
* `translator_id = 0`

---

#### (Optional) Identify related products

```sql
SELECT
p.ID, p.post_title, COUNT(*) AS orphan_rows
FROM wp_icl_translation_status s
LEFT JOIN wp_icl_translations it ON it.translation_id = s.translation_id
LEFT JOIN wp_posts child ON child.ID = it.element_id
LEFT JOIN wp_posts p ON p.ID = CASE
WHEN child.post_type = 'product_variation' THEN child.post_parent
ELSE child.ID END
WHERE s.translation_service = 0
AND s.translator_id = 0
GROUP BY p.ID;
```

---

#### Backup (safety)

```sql
CREATE TABLE wp_icl_translation_status_backup AS
SELECT * FROM wp_icl_translation_status;
```

---

#### Delete corrupted entries (fix)

```sql
DELETE FROM wp_icl_translation_status
WHERE translation_service = 0
AND translator_id = 0;
```

---

After running this cleanup, WPML starts working again correctly.

---

### 5. Conclusion

Based on our analysis:

* the issue is NOT caused by manual translation actions
* it is triggered by automatic stock updates via external connector
* WPML incorrectly creates translation jobs with `translator_id = 0`
* these invalid entries accumulate and eventually cause a critical error

---

### 6. What we need from you

We would like to understand:

1. Why WPML creates translation jobs during stock updates
2. Why these jobs are created with `translator_id = 0`
3. How to prevent this behavior permanently

We are happy to provide additional data or run tests if needed.

Thank you in advance for your support.

Best regards

Screenshot (2501).png
April 8, 2026 at 8:44 am #17956013

Paola Mendiburu
WPML Supporter since 11/2020

Languages: English (English ) Spanish (Español ) Italian (Italiano )

Timezone: Europe/Madrid (GMT+02:00)

Hi there!

I ran some tests on my side and I was not able to reproduce the issue by updating the stock manually from the WooCommerce product editor. In those tests, updating the stock did not create a new translation job.

Because of this, my current impression is that the issue may not be caused by the stock change alone, but rather by the specific way the external connector (or any custom code involved in the update process) is writing the product data.

Could you try to update stock from WooCommerce directly and let me know if a new job is created? That way we can know if the issue is related to the external connector .

Please let me know what you find.

The topic ‘[Closed] WPML creates invalid translation jobs during stock-only updates (wp_icl_translation_status corruptio…’ is closed to new replies.