WPML
ステータス
未解決
トピックタグ
WCML

問題の概要

WooCommerceの商品の短い説明は投稿の抜粋フィールドに基づいており、これは通常、ショートコードを処理しないシンプルなテキストフィールドです。そのため、ページビルダーのショートコードを投稿の抜粋に貼り付けても機能することは想定されていません。また、投稿の抜粋を翻訳する際、WPMLはそのようなショートコードを処理しようとはしません。

しかし、WCはこれらの「抜粋」を少し異なる方法で処理するため、ショートコードが機能します。それにもかかわらず、WPMLは依然として機能しないかのように動作します。そのため、ショートコードに翻訳が必要な属性や自動的に処理されるべき内部リンクが含まれている場合、それらを容易に処理することはできません。

回避策

この機能を提供するために、プラグインとして追加できるコードを用意しました。以下のコードをコピーして、wpmlpb-excerpts.phpなどの名前を付けたファイルに貼り付け、wp-content/plugins/ディレクトリに保存してから、プラグインを有効化してください。

<?php
/**
 * Plugin Name: WPML Page Builders - Proces Excerpts
 * Description: Parses shortcode strings in exceprts.
 * Version: 1.0
 */
namespace WPMLPB686;

( new Excerpts() )->add_hooks();

class Excerpts {

	const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
	const SEPARATOR_END   = '<!--WPML_EXCERPT_END-->';

	public function add_hooks() {
		add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
		add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
		add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
	}

	public function joinWithContent( $content, $id ) {
		$post = get_post( $id );
		if ( $post && $post->post_excerpt ) {
			$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
		}

		return $content;
	}

	public function excludeFromJob( $package, $post ) {
		if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
			$package['contents']['excerpt']['translate'] = 0;
			$package['contents']['excerpt']['data']      = '';
		}

		return $package;
	}

	public function splitFromContent( $post_id ) {
		$post = get_post( $post_id );
		if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
			$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
			$end_pos   = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );

			if ( false !== $end_pos ) {
				$content = substr( $post->post_content, 0, $start_pos );
				$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );

				if ( $excerpt ) {
					wp_update_post(
						[
							'ID'           => $post_id,
							'post_content' => $content,
							'post_excerpt' => $excerpt,
						]
					);
				}
			}
		}
	}
}

すべての既知の問題 →