2026-01-22 15:17:18 +00:00

153 lines
3.9 KiB
PHP

<?php
/**
* WPML Integration.
*
* @since 1.0.256
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\ThirdParty;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* WPML class.
*/
class WPML {
use Hooker;
/**
* Class constructor.
*/
public function __construct() {
$this->action( 'save_post', 'save_post', 10, 3 );
$this->filter( 'rank_math/schema/update', 'update_schema', 10, 2 );
}
/**
* Update schema action handler.
*
* @param int $object_id Object ID.
* @param array $schemas Schemas.
*
* @return void
*/
public function update_schema( $object_id, $schemas ) {
$settings = get_option( 'icl_sitepress_settings', [] );
$custom_fields = $settings['translation-management']['custom_fields_translation'] ?? [];
foreach ( $schemas as $meta_id => $schema ) {
$type = is_array( $schema['@type'] ) ? $schema['@type'][0] : $schema['@type'];
$meta_key = 'rank_math_schema_' . $type;
if ( ! isset( $custom_fields[ $meta_key ] ) ) {
$custom_fields[ $meta_key ] = '2';
}
$settings['translation-management']['custom_fields_translation'] = $custom_fields;
}
update_option( 'icl_sitepress_settings', $settings );
}
/**
* Save post action handler.
*
* @param int $post_id Post ID.
* @param WP_Post $post Post object.
* @param bool $update Whether this is an existing post being updated or not.
*
* @return void
*/
public function save_post( $post_id, $post, $update ) {
if (
'revision' === $post->post_type ||
'publish' !== $post->post_status ||
! isset( $_POST['skip_sitepress_actions'] ) ||
! sanitize_text_field( wp_unslash( $_POST['skip_sitepress_actions'] ) ) ||
( isset( $_POST['post_ID'] ) && (int) $_POST['post_ID'] !== $post_id )
) {
return;
}
global $rm_wpml_translated_post_id;
if ( ! $update || ! $rm_wpml_translated_post_id ) {
$rm_wpml_translated_post_id = $post_id;
return;
}
$rm_wpml_translated_post_id = 0;
$content = $post->post_content;
$block_updated = $this->maybe_update_schema_blocks( $content, $post_id );
$shortcode_updated = $this->maybe_update_schema_shortcodes( $content );
if ( ! $block_updated && ! $shortcode_updated ) {
return;
}
wp_update_post(
[
'ID' => $post_id,
'post_content' => $content,
]
);
}
/**
* Maybe update schema blocks.
*
* @param string $content Post content.
* @param int $post_id Post ID.
*/
private function maybe_update_schema_blocks( &$content, $post_id ) {
preg_match_all( '/<!--\s*wp:rank-math\/rich-snippet\s*(\{.*\})\s*\/-->/m', $content, $blocks, PREG_SET_ORDER );
if ( empty( $blocks ) ) {
return false;
}
foreach ( $blocks as $block ) {
$attr = json_decode( $block[1], true );
$attr['post_id'] = $post_id;
$content = str_replace( $block[0], '<!-- wp:rank-math/rich-snippet ' . wp_json_encode( $attr, JSON_UNESCAPED_SLASHES ) . ' /-->', $content );
}
return true;
}
/**
* Maybe update schema shortcodes.
*
* @param string $content Post content.
*/
private function maybe_update_schema_shortcodes( &$content ) {
$pattern = '/\[rank_math_rich_snippet\s+([^\]]*)\]/';
if ( ! preg_match_all( $pattern, $content, $shortcodes, PREG_SET_ORDER ) ) {
return false;
}
$updated = false;
foreach ( $shortcodes as $shortcode ) {
$attributes = $shortcode[1];
// Remove id attribute with double quotes: id="...".
$new_attributes = preg_replace( '/id\s*=\s*"[^"]*"/', 'id=""', $attributes );
// Remove id attribute with single quotes: id='...'.
$new_attributes = preg_replace( "/id\s*=\s*'[^']*'/", "id=''", $new_attributes );
if ( $new_attributes !== $attributes ) {
$content = str_replace( $shortcode[0], '[rank_math_rich_snippet ' . $new_attributes . ']', $content );
$updated = true;
}
}
return $updated;
}
}