Это форум технической поддержки WPML – плагина для многоязычной WordPress.
Доступно для чтения всем, но только клиенты, купившие WPML, могут оставлять сообщения. Сотрудники WPML отвечают на сообщения форума 6 дней в неделю, 22 часов в сутки.
Предыстория вопроса:
Я написал плагин, который рассылает подписчикам сайта на том языке, на какой языковой версии они подписались. Если я планирую публикацию новости, перевожу её. То в момент автоматической публикации русскоязычные подписчики получают письмо на русском, а украисноязычные на украсинском. Если же я публикую сразу без перевода, например на русском, то письмо приходит на русском для русскоязычных.
Симптомы:
Если делать пост на украиснском, публикуя сразу, то письмо приходит укариноязычнм подписчикам, но на русском языке. И только ссылка на статью украиснскую, ну и название статьи на украинском. Все остальное на русском.
Вопросы:
Почему письма приходят на русском для украиноязычных подписчиков, если пост публикуется сразу на украинском?
<?php
/*
Plugin Name: Multilang Post Notifier
Description: Автоматична розсилка новин підписникам з урахуванням мови (WPML).
Version: 1.7
Author: WebSCS
Text Domain: mpn-plugin
*/
add_action('publish_post', 'mpn_send_post_notifications', 10, 2);
function mpn_send_post_notifications($post_ID, $post) {
// Проверяем, что это пост (не страница или другой тип записи)
if ($post->post_type !== 'post') return;
global $wpdb, $sitepress;
$table_name = $wpdb->prefix . 'mes_subscribers';
// Определяем язык поста через WPML
$lang = apply_filters('wpml_post_language_details', null, $post_ID);
$post_lang = $lang['language_code'] ?? 'uk';
// Логируем язык поста для отладки
error_log("Post $post_ID language detected: $post_lang");
// Устанавливаем язык через SitePress (если доступен)
if (isset($sitepress) && method_exists($sitepress, 'switch_lang')) {
$sitepress->switch_lang($post_lang);
error_log("Language switched to: $post_lang via SitePress");
} else {
error_log("SitePress language switch not available");
}
// Получаем заголовок и URL с учетом языка
$post_title = get_the_title($post_ID);
$post_url = apply_filters('wpml_permalink', get_permalink($post_ID), $post_ID, $post_lang);
// Логируем заголовок и URL для отладки
error_log("Post title: $post_title, URL: $post_url");
// Выбираем подписчиков, которые подтверждены и подписаны на язык поста
$subscribers = $wpdb->get_results($wpdb->prepare("SELECT email, token FROM $table_name WHERE confirmed = 1 AND lang = %s", $post_lang));
if (empty($subscribers)) {
error_log("No subscribers found for lang $post_lang");
return;
}
// Массив для отслеживания отправленных писем (чтобы избежать дублирования)
static $sent_emails = [];
foreach ($subscribers as $sub) {
// Пропускаем, если письмо уже отправлено этому подписчику для этого поста
$email_key = $sub->email . '-' . $post_ID;
if (isset($sent_emails[$email_key])) {
error_log("Skipping duplicate email to {$sub->email} for post $post_ID");
continue;
}