- Trạng thái
- Đang mở
- Thẻ chủ đề
- WCML
Tổng quan về lỗi
Miêu tả ngắn về sản phẩm WooCommerce dựa trên trường tóm tắt bài viết, và thông thường đó là một trường văn bản đơn giản không xử lý các shortcode. Do đó, không thể kỳ vọng rằng nếu bạn dán các shortcode của trình tạo trang vào phần tóm tắt bài viết thì chúng sẽ hoạt động, và khi dịch các phần tóm tắt bài viết, WPML không cố gắng xử lý các shortcode như vậy.
Nhưng WC xử lý các “phần tóm tắt” này hơi khác một chút, và các shortcode thực sự hoạt động, nhưng WPML vẫn coi như chúng không hoạt động, và nếu shortcode bao gồm các thuộc tính cần dịch hoặc các liên kết nội bộ cần được xử lý tự động thì điều đó không dễ dàng thực hiện được.
Giải pháp tạm thời
Chúng tôi đã chuẩn bị mã có thể được thêm dưới dạng một plugin để cung cấp chức năng này. Sao chép và dán mã dưới đây vào một tệp mà bạn có thể đặt tên là wpmlpb-excerpts.php và lưu trong thư mục wp-content/plugins/ của bạn, sau đó kích hoạt plugin.
<?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,
]
);
}
}
}
}
}