Skip navigation

Это форум технической поддержки WPML – плагина для многоязычной WordPress.

Доступно для чтения всем, но только клиенты, купившие WPML, могут оставлять сообщения. Сотрудники WPML отвечают на сообщения форума 6 дней в неделю, 22 часов в сутки.

Эта тема содержит 1 ответ, имеет 1 голос.

Последнее обновление: stanislavS-19 3 дня, 8 часов назад.

При содействии: Andrey.

Автор Записи
9 мая, 2025 на 9:45 пп #17018014

stanislavS-19

Предыстория вопроса:
Я написал плагин, который рассылает подписчикам сайта на том языке, на какой языковой версии они подписались. Если я планирую публикацию новости, перевожу её. То в момент автоматической публикации русскоязычные подписчики получают письмо на русском, а украисноязычные на украсинском. Если же я публикую сразу без перевода, например на русском, то письмо приходит на русском для русскоязычных.

Симптомы:
Если делать пост на украиснском, публикуя сразу, то письмо приходит укариноязычнм подписчикам, но на русском языке. И только ссылка на статью украиснскую, ну и название статьи на украинском. Все остальное на русском.

Вопросы:
Почему письма приходят на русском для украиноязычных подписчиков, если пост публикуется сразу на украинском?

9 мая, 2025 на 9:48 пп #17018016

stanislavS-19

<?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;
}

$site_name = get_bloginfo('name');
$site_url = home_url();
$logo_url = 'скрытая ссылка';
$forum_url = 'скрытая ссылка';

// Динамически получаем текущий год
$current_year = date('Y');

// Используем переведенные строки
$subject = sprintf(__('%s: Нова стаття на сайті 📬', 'mpn-plugin'), $site_name);
$intro = __('На сайті з’явилась нова стаття: ✨', 'mpn-plugin');
$unsubscribe_text = __('Відписатися від розсилки', 'mpn-plugin');
$forum_invite_text = __('Запрошуємо відвідати наш форум для обговорення новини: %s 🚀', 'mpn-plugin');
$forum_invite = sprintf(
$forum_invite_text,
'' . esc_url($forum_url) . ''
);
$telegram_invite = __('Приєднуйтесь до нашої скрытая ссылка">групи в Telegram, отримуйте важливі сповіщення через скрытая ссылка">Telegram канал 📱', 'mpn-plugin');
$auto_message = __('Цього листа згенеровано автоматично для вашої зручності. Просимо не відповідати, щоб наш сервер міг спокійно пити каву ☕.', 'mpn-plugin');
$forum_label = __('скрытая ссылка">eWorldForum: Ваш форум електродрайву! ⚡', 'mpn-plugin');
$news_label = __('скрытая ссылка">eWorldNews: Ваш заряд новин! 🌐', 'mpn-plugin');
$copyright = sprintf(__('Copyright © 2022-%s 🎉', 'mpn-plugin'), $current_year);
$telegram_promo = __('Не витрачай час даремно, підписуйся на скрытая ссылка">Telegram канал, отримуй анонси нових статей і сам вирішуй, що читати 📣.', 'mpn-plugin');

// Массив для отслеживания отправленных писем (чтобы избежать дублирования)
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;
}

$unsubscribe_url = add_query_arg(['mes_unsubscribe' => $sub->token], $site_url);

// Формируем HTML-контент письма
$message = '
<!DOCTYPE html>
<html lang="' . ($post_lang === 'uk' ? 'uk-UA' : ($post_lang === 'ru' ? 'ru-RU' : $post_lang)) . '">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
font-family: "Tahoma", "Arial", "Helvetica", sans-serif;
line-height: 1.6;
color: #333;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 20px auto;
background-color: #ffffff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.header {
text-align: center;
margin-bottom: 20px;
}
.header img {
max-width: 150px;
height: auto;
}
.content {
padding: 20px;
}
.post-title a {
font-size: 20px;
color: #0073e6;
text-decoration: none;
font-weight: 600;
}
.post-title a:hover {
text-decoration: underline;
}
.intro {
margin-bottom: 10px;
font-size: 16px;
}
.telegram-promo {
margin-top: 10px;
margin-bottom: 10px;
font-size: 14px;
}
.telegram-promo a {
color: #0073e6;
text-decoration: none;
}
.telegram-promo a:hover {
text-decoration: underline;
}
.forum-invite {
margin-top: 10px;
margin-bottom: 10px;
font-size: 15px;
}
.forum-invite a {
color: #0073e6;
text-decoration: none;
}
.forum-invite a:hover {
text-decoration: underline;
}
.footer {
margin-top: 15px;
text-align: center;
font-size: 12px;
color: #666;
padding-top: 10px;
}
.social-links {
margin: 5px 0;
}
.social-links a {
margin: 0 2px;
text-decoration: none;
}
.social-links img {
width: 24px;
height: 24px;
vertical-align: middle;
}
.unsubscribe {
margin-top: 10px;
font-size: 12px;
}
.unsubscribe a {
color: #0073e6;
text-decoration: none;
}
.unsubscribe a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<div class="header">

' . esc_attr($site_name) . ' Logo

</div>
<div class="content">
<p class="intro">' . esc_html($intro) . '</p>
<p class="post-title">
' . esc_html($post_title) . '
</p>
<p class="telegram-promo">' . $telegram_promo . '</p>
<p class="forum-invite">' . $forum_invite . '</p>
</div>
<div class="footer">
<hr>
<p>' . $telegram_invite . '</p>
<div class="social-links">
скрытая ссылка"><img src="скрытая ссылка" alt="Viber" width="24" height="24" />
скрытая ссылка"><img style="padding-left: 3px;" src="скрытая ссылка" alt="Telegram" width="24" height="24" />
скрытая ссылка"><img style="padding-left: 3px;" src="скрытая ссылка" alt="Facebook" width="24" height="24" />
скрытая ссылка"><img style="padding-left: 3px;" src="скрытая ссылка" alt="Instagram" width="24" height="24" />
скрытая ссылка"><img style="padding-left: 3px;" src="скрытая ссылка" alt="YouTube" width="24" height="24" />
</div>
<p>' . esc_html($auto_message) . '<br>
' . $forum_label . '<br>
' . $news_label . '<br>
' . esc_html($copyright) . '</p>
<p class="unsubscribe">' . esc_html($unsubscribe_text) . '</p>
</div>
</div>
</body>
</html>';

// Устанавливаем заголовки для HTML-письма и отправителя с указанием языка
$headers = array(
'Content-Type: text/html; charset=UTF-8',
'Content-Language: ' . ($post_lang === 'uk' ? 'uk-UA' : ($post_lang === 'ru' ? 'ru-RU' : $post_lang)),
'From: ' . esc_html($site_name) . ' <no-reply@eworld.in.ua>',
);

// Отправляем письмо и логируем результат
$result = wp_mail($sub->email, $subject, $message, $headers);
error_log("wp_mail to {$sub->email} result: " . ($result ? 'success' : 'failed'));

// Отмечаем, что письмо отправлено
$sent_emails[$email_key] = true;
}
}

9 мая, 2025 на 11:09 пп #17018101

stanislavS-19

я разобрался