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

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

Помечено: 

This topic contains 21 ответов, has 2 голосов.

Last updated by Александр Крутов 3 месяца, 1 неделя назад.

Assigned support staff: Andrey.

Автор Посты
Ноябрь 2, 2018 в 7:53 пп #2872796

Александр Крутов

Здравствуйте! Прошу помочь понять, как мне правильно применить WPML. Основной язык сайта - русский. Сайт является доской объявлений. Пользователь создает объявление на языке, который он сам выбирает, например на русском, украинском или английском. Необходимо, чтобы это объявление для всех локализаций отображалось на языке, на котором было создано, а переводы его не нужны. Так можно настроить сайт?

В тоже время, существует пользовательский тип записи (организация), которую нужно переводить на другие языки. Как совместить эти задачи?

Ноябрь 5, 2018 в 6:23 пп #2878010

Andrey
Supporter

Languages: Английский (English ) Русский (Русский )

Timezone: Europe/Kiev (GMT+03:00)

Здравствуйте,

Насколько правильно я Вас понимаю, после создания объявления не важно на каком языке, Вам нужно отображать его на других языках также (как бы просто продублировав)?

В таком случае есть два варианта:
1) Это вручную каждое объявление, дублировать на остальные языки использовав опцию которая доступна;
https://wpml.org/documentation/translating-your-contents/displaying-untranslated-content-on-pages-in-secondary-languages/using-content-duplication/#duplicating-content-from-the-editor

2) Написав пользовательский код по автоматическому дублированию объявления после его создания по примеру ниже:
https://wpml.org/wpml-hook/wpml_post_duplicates/
Хочу отметить, что пользовательское программирование не входить предоставляемую поддержку.

В обоих случаях Вам необходимо выставить пользовательский тип записи для объявлений в настройку "Translatable – only show translated items." в WPML >> Settings.

Там же, есть настройка "Translatable – use translation if available or fallback to default language"
https://wpml.org/documentation/translating-your-contents/displaying-untranslated-content-on-pages-in-secondary-languages/
Данная опция позволяет отображать на других языках не переведенные посты, но только работает по отношению к языку по умолчанию, в Вашем случае к русскому. То есть, при создании объявления на русском, будет отображаться на других без перевода и дублирования. При создании на других языках будет отображаться на языке в котором было создано объявление, но не других.

Пользовательский тип записи (организация), Вы можете выставить в настройку "Translatable – only show translated items." или же "Translatable – use translation if available or fallback to default language" .

Ноябрь 5, 2018 в 8:13 пп #2878298

Александр Крутов

Андрей, спасибо за ответ!
Я понял, что первый вариант мне не подходит, т.к. каждое новое объявление прийдется дублировать модератору.

Буду использовать второй вариант, только не пойму, какие мои данные нужно подставлять в
// $my_duplications will return an associative array with language codes as indexes and post_ids as values
$my_duplications = apply_filters( 'wpml_post_duplicates', 28 );

У меня нет бюджета на разработку, поэтому ищу инструменты, с какими могу сам справиться с настройкой сайта. Буду вам благодарен за разъяснения. Сам WPML очень полезная и нужная разработка, но довольно сложная для любителя вроде меня.

У моего типа записи, которая может быть создана на любом из языков сайта (пока на трёх - русс., укр., англ.) и должна отображаться на любом из них в непереведенном виде, такие параметры:
Post Type "gd_loss"
Listing Slug "losses"
Post type "losses"

Как именно должен выглядеть этот код?

Ноябрь 6, 2018 в 12:43 пп #2880854

Александр Крутов

Я обратился к поддержке GD. Но они ссылаются на вас. Надеюсь, что вы сможете мне помочь.

Ноябрь 6, 2018 в 1:15 пп #2880968

Александр Крутов

Кстати, они посоветовали обратить внимание на этот пост https://wpml.org/forums/topic/how-to-automatically-create-duplicate-translations/#post-507498

Что вы думаете, это решает мою задачу?

Ноябрь 6, 2018 в 2:11 пп #2881187

Andrey
Supporter

Languages: Английский (English ) Русский (Русский )

Timezone: Europe/Kiev (GMT+03:00)

Да, они ссылаются на нас так код применяется к WPML.

В начале, я дал Вам ссылку не с тем примером. Вот более продвинутый пример, похожий на тот, который в посте указали:
https://wpml.org/wpml-hook/wpml_admin_make_post_duplicates/

Вам нужно его адаптировать под Вашу задачу:
1) Указать в нем необходимый тип записи где он будет срабатывать
2) Посылать в него $post_id объявления которое будет создаваться

При правильной адаптации это должно решить Ваш вопрос.

Ноябрь 6, 2018 в 2:19 пп #2881263

Andrey
Supporter

Languages: Английский (English ) Русский (Русский )

Timezone: Europe/Kiev (GMT+03:00)

Поправочка, Вам нужно добавить только условие в него, для какого типа записи данный код будет применятся.
Насколько я вижу, код будет отрабатывать каждый раз когда, объявление будет создано. То есть, при создании объявления, оно должно автоматически быть дублировано.

Ноябрь 6, 2018 в 2:22 пп #2881271

Andrey
Supporter

Languages: Английский (English ) Русский (Русский )

Timezone: Europe/Kiev (GMT+03:00)

Если вдруг не будет отрабатывать, тогда попробуйте повесить данный код на другой хук (hook), к примеру использовать add_action('save_post', 'my_duplicate_on_publish');

Ноябрь 6, 2018 в 2:51 пп #2881451

Александр Крутов

Андрей, спасибо, приближаюсь к пониманию. 1-й вопрос, что делать с уже существующими записями, их можно все продублировать автоматически или нужно после добавления кода открывать и обновлять каждую?

2-й вопрос, понимаю, что задаю элементарные вопросы, но пытаюсь сам разобраться, хоть и не специалист. Мне не понятно, какие параметры из моей конфигурации нужно подставить в код "Более продвинутый пример". Нужно заменить "$post_id" и "$post" на мои значения? Это что-то из Post Type "gd_loss", Listing Slug "losses", Post type "losses"? Или это другие параметры? Можно дать вам доступ в админку, чтобы вы посмотрели?

Ноябрь 6, 2018 в 3:17 пп #2881597

Andrey
Supporter

Languages: Английский (English ) Русский (Русский )

Timezone: Europe/Kiev (GMT+03:00)

Андрей, спасибо, приближаюсь к пониманию. 1-й вопрос, что делать с уже существующими записями, их можно все продублировать автоматически или нужно после добавления кода открывать и обновлять каждую?
Функция сама по себе не отработает. Можете просто вручную дубликаты сделать через WPML >> Translatin Management.
https://wpml.org/documentation/translating-your-contents/displaying-untranslated-content-on-pages-in-secondary-languages/using-content-duplication/#batch-duplicating

Данную функцию Вам необходимо скопировать и вставить в functions.php Вашей темы.

Примерно будет выглядеть так:

add_action( 'wp_insert_post', 'my_duplicate_on_publish' );
function my_duplicate_on_publish( $post_id ) {
    global $post;
	
	if ( isset( $post->post_type ) && $post->post_type == 'gd_loss' ) {
			
		// don't save for autosave
		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
			return $post_id;
		}
		// dont save for revisions
		if ( isset( $post->post_type ) && $post->post_type == 'revision' ) {
			return $post_id;
		}
	 
		// we need this to avoid recursion see add_action at the end
		remove_action( 'wp_insert_post', 'my_duplicate_on_publish' );
	 
			// make duplicates if the post being saved
			// #1. itself is not a duplicate of another or
			// #2. does not already have translations
	 
			$is_translated = apply_filters( 'wpml_element_has_translations', '', $post_id, $post->post_type );
	 
			if ( !$is_translated ) {
				do_action( 'wpml_admin_make_post_duplicates', $post_id );
			}
	 
		// must hook again - see remove_action further up
		add_action( 'wp_insert_post', 'my_duplicate_on_publish' );
	}
}

Здесь, я добавил условие которое выполняется для определенного типа записи

	if ( isset( $post->post_type ) && $post->post_type == 'gd_loss' ) {

где gd_loss это Ваш тип записи

Насколько я вижу, больше никаких изменений ненужно, код я не тестировал. Не забывайте делать бэкапы. Предполагаю, что доступ будет не нужен.

Ноябрь 6, 2018 в 3:55 пп #2881713

Александр Крутов

я понял, сделаю бэкап, буду пробовать. Спасибо.

Ноябрь 10, 2018 в 10:51 дп #2895420

Александр Крутов

код добавил, он не вызвал белый экран, что уже радует. Но результат автоматического дублирования записей не достигнут. Наверное, что-то еще нужно настраивать в WPML?

Ноябрь 12, 2018 в 2:39 пп #2898993

Andrey
Supporter

Languages: Английский (English ) Русский (Русский )

Timezone: Europe/Kiev (GMT+03:00)

А работает ли это с админки? Если, к примеру Вы создадите пост в пост тайпе "gd_loss". Есть дублирование?

Ноябрь 12, 2018 в 7:06 пп #2899823

Александр Крутов

Создал запись из админки. Дубль не добавился.

Ноябрь 13, 2018 в 3:55 пп #2903551

Andrey
Supporter

Languages: Английский (English ) Русский (Русский )

Timezone: Europe/Kiev (GMT+03:00)

Мне нужно запросить временный доступ (WP-администратора и FTP) на Ваш сайт - предпочтительно к тестовому сайту, где проблема была воспроизведена, если это возможно - для того, чтобы лучше помочь. Вы найдете необходимые поля ниже поля для комментариев, когда Вы войдете, чтобы оставить свой следующий ответ. Информацию, которую Вы ведете является частной, что означает только Вы и я могу видеть и иметь доступ к ней.