Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/classes/taxonomy-term-translation/class-wpml-sync-term-meta-action.php
2023-09-12 21:41:04 +02:00

136 lines
3.8 KiB
PHP

<?php
class WPML_Sync_Term_Meta_Action {
/** @var SitePress $sitepress */
private $sitepress;
/** @var int $term_taxonomy_id */
private $term_taxonomy_id;
/** @var bool $is_new_term */
private $is_new_term;
/**
* WPML_Sync_Term_Meta_Action constructor.
*
* @param SitePress $sitepress
* @param int $term_taxonomy_id just saved term's term_taxonomy_id
* @param bool $is_new_term
*/
public function __construct( $sitepress, $term_taxonomy_id, $is_new_term = false ) {
$this->sitepress = $sitepress;
$this->term_taxonomy_id = $term_taxonomy_id;
$this->is_new_term = $is_new_term;
}
/**
* Copies to be synchronized term meta data to the translations of the term.
*/
public function run() {
$term_taxonomy_id_from = $this->sitepress->term_translations()->get_original_element( $this->term_taxonomy_id );
if ( ! $term_taxonomy_id_from ) {
$term_taxonomy_id_from = $this->term_taxonomy_id;
}
$translations = $this->sitepress
->term_translations()
->get_element_translations( $term_taxonomy_id_from, false, true );
if ( ! empty( $translations ) ) {
foreach ( $translations as $term_taxonomy_id_to ) {
$this->copy_custom_fields( (int) $term_taxonomy_id_to, $term_taxonomy_id_from );
}
}
}
/**
* @param int $term_taxonomy_id_to
* @param int $term_taxonomy_id_from
*/
private function copy_custom_fields( $term_taxonomy_id_to, $term_taxonomy_id_from ) {
$cf_copy = array();
$setting_factory = $this->sitepress->core_tm()->settings_factory();
$meta_keys = $setting_factory->get_term_meta_keys();
foreach ( $meta_keys as $meta_key ) {
$meta_key_status = $setting_factory->term_meta_setting( $meta_key )->status();
if ( WPML_COPY_CUSTOM_FIELD === $meta_key_status
|| $this->should_copy_once( $meta_key_status, $term_taxonomy_id_to )
) {
$cf_copy[] = $meta_key;
}
}
$term_id_to = $this->sitepress->term_translations()->adjust_term_id_for_ttid( $term_taxonomy_id_to );
$term_id_from = $this->sitepress->term_translations()->adjust_term_id_for_ttid( $term_taxonomy_id_from );
foreach ( $cf_copy as $meta_key ) {
$meta_from = $this->sitepress->get_wp_api()->get_term_meta( $term_id_from, $meta_key );
$meta_to = $this->sitepress->get_wp_api()->get_term_meta( $term_id_to, $meta_key );
if ( $meta_from || $meta_to ) {
$this->sync_custom_field( $term_id_from, $term_id_to, $meta_key );
}
}
}
private function sync_custom_field(
$term_id_from,
$term_id_to,
$meta_key
) {
$wpdb = $this->sitepress->wpdb();
$sql = "SELECT meta_value FROM {$wpdb->termmeta} WHERE term_id=%d AND meta_key=%s";
$values_from = $wpdb->get_col(
$wpdb->prepare(
$sql,
array( $term_id_from, $meta_key )
)
);
$values_to = $wpdb->get_col(
$wpdb->prepare(
$sql,
array( $term_id_to, $meta_key )
)
);
$removed = array_diff( $values_to, $values_from );
foreach ( $removed as $v ) {
$delete_prepared = $wpdb->prepare(
"DELETE FROM {$wpdb->termmeta}
WHERE term_id=%d
AND meta_key=%s
AND meta_value=%s",
array( $term_id_to, $meta_key, $v )
);
$wpdb->query( $delete_prepared );
}
$added = array_diff( $values_from, $values_to );
foreach ( $added as $v ) {
$insert_prepared = $wpdb->prepare(
"INSERT INTO {$wpdb->termmeta}(term_id, meta_key, meta_value)
VALUES(%d, %s, %s)",
array( $term_id_to, $meta_key, $v )
);
$wpdb->query( $insert_prepared );
}
wp_cache_init();
}
/**
* @param int $meta_key_status
* @param int $term_taxonomy_id_to
*
* @return bool
*/
private function should_copy_once( $meta_key_status, $term_taxonomy_id_to ) {
return $this->is_new_term
&& WPML_COPY_ONCE_CUSTOM_FIELD === $meta_key_status
&& $term_taxonomy_id_to === $this->term_taxonomy_id;
}
}