2021-09-21 15:01:08 +02:00
< ? php
2021-09-21 15:06:29 +02:00
/**
* @ package Polylang
*/
2021-09-21 15:01:08 +02:00
/**
* Manages copy and synchronization of terms and post metas
*
* @ since 1.2
*/
2021-09-21 15:06:29 +02:00
class PLL_Admin_Sync extends PLL_Sync {
2021-09-21 15:01:08 +02:00
/**
* Constructor
*
* @ since 1.2
*
* @ param object $polylang
*/
public function __construct ( & $polylang ) {
2021-09-21 15:06:29 +02:00
parent :: __construct ( $polylang );
2021-09-21 15:01:08 +02:00
add_filter ( 'wp_insert_post_parent' , array ( $this , 'wp_insert_post_parent' ), 10 , 3 );
2021-09-21 15:06:29 +02:00
add_filter ( 'wp_insert_post_data' , array ( $this , 'wp_insert_post_data' ) );
add_filter ( 'use_block_editor_for_post' , array ( $this , 'new_post_translation' ), 5000 ); // After content duplication.
2021-09-21 15:01:08 +02:00
}
/**
* Translate post parent if exists when using " Add new " ( translation )
*
* @ since 0.6
*
* @ param int $post_parent Post parent ID
* @ param int $post_id Post ID , unused
* @ param array $postarr Array of parsed post data
* @ return int
*/
public function wp_insert_post_parent ( $post_parent , $post_id , $postarr ) {
2021-09-21 15:06:29 +02:00
if ( isset ( $_GET [ 'from_post' ], $_GET [ 'new_lang' ], $_GET [ 'post_type' ] ) ) {
check_admin_referer ( 'new-post-translation' );
// Make sure not to impact media translations created at the same time
if ( $_GET [ 'post_type' ] === $postarr [ 'post_type' ] && ( $id = wp_get_post_parent_id ( ( int ) $_GET [ 'from_post' ] ) ) && $parent = $this -> model -> post -> get_translation ( $id , sanitize_key ( $_GET [ 'new_lang' ] ) ) ) {
$post_parent = $parent ;
}
}
return $post_parent ;
2021-09-21 15:01:08 +02:00
}
/**
2021-09-21 15:06:29 +02:00
* Copy menu order , comment , ping status and optionally the date when creating a new tanslation
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ since 2.5
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ param array $data An array of slashed post data .
* @ return array
2021-09-21 15:01:08 +02:00
*/
2021-09-21 15:06:29 +02:00
public function wp_insert_post_data ( $data ) {
if ( isset ( $GLOBALS [ 'pagenow' ], $_GET [ 'from_post' ], $_GET [ 'new_lang' ] ) && 'post-new.php' === $GLOBALS [ 'pagenow' ] && $this -> model -> is_translated_post_type ( $data [ 'post_type' ] ) ) {
check_admin_referer ( 'new-post-translation' );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
$from_post_id = ( int ) $_GET [ 'from_post' ];
$from_post = get_post ( $from_post_id );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
if ( $from_post instanceof WP_Post ) {
foreach ( array ( 'menu_order' , 'comment_status' , 'ping_status' ) as $property ) {
$data [ $property ] = $from_post -> $property ;
}
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
// Copy the date only if the synchronization is activated
if ( in_array ( 'post_date' , $this -> options [ 'sync' ] ) ) {
$data [ 'post_date' ] = $from_post -> post_date ;
$data [ 'post_date_gmt' ] = $from_post -> post_date_gmt ;
}
2021-09-21 15:01:08 +02:00
}
}
2021-09-21 15:06:29 +02:00
return $data ;
2021-09-21 15:01:08 +02:00
}
/**
2021-09-21 15:06:29 +02:00
* Copy post metas , and taxonomies when using " Add new " ( translation )
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ since 2.5
* @ since 3.1 Use of use_block_editor_for_post filter instead of rest_api_init which is triggered too early in WP 5.8 .
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ param bool $is_block_editor Whether the post can be edited or not .
* @ return bool
2021-09-21 15:01:08 +02:00
*/
2021-09-21 15:06:29 +02:00
public function new_post_translation ( $is_block_editor ) {
global $post ;
static $done = array ();
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
if ( ! empty ( $post ) && isset ( $GLOBALS [ 'pagenow' ], $_GET [ 'from_post' ], $_GET [ 'new_lang' ] ) && 'post-new.php' === $GLOBALS [ 'pagenow' ] && $this -> model -> is_translated_post_type ( $post -> post_type ) ) {
check_admin_referer ( 'new-post-translation' );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
// Capability check already done in post-new.php
$from_post_id = ( int ) $_GET [ 'from_post' ];
$lang = $this -> model -> get_language ( sanitize_key ( $_GET [ 'new_lang' ] ) );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
if ( ! $from_post_id || ! $lang || ! empty ( $done [ $from_post_id ] ) ) {
return $is_block_editor ;
2021-09-21 15:01:08 +02:00
}
2021-09-21 15:06:29 +02:00
$done [ $from_post_id ] = true ; // Avoid a second duplication in the block editor. Using an array only to allow multiple phpunit tests.
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
$this -> taxonomies -> copy ( $from_post_id , $post -> ID , $lang -> slug );
$this -> post_metas -> copy ( $from_post_id , $post -> ID , $lang -> slug );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
if ( is_sticky ( $from_post_id ) ) {
stick_post ( $post -> ID );
2021-09-21 15:01:08 +02:00
}
}
2021-09-21 15:06:29 +02:00
return $is_block_editor ;
2021-09-21 15:01:08 +02:00
}
/**
2021-09-21 15:06:29 +02:00
* Get post fields to synchronize .
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ since 2.4
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ param WP_Post $post Post object .
* @ return array Fields to synchronize .
2021-09-21 15:01:08 +02:00
*/
2021-09-21 15:06:29 +02:00
protected function get_fields_to_sync ( $post ) {
2021-09-21 15:01:08 +02:00
global $wpdb ;
2021-09-21 15:06:29 +02:00
$postarr = parent :: get_fields_to_sync ( $post );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
// For new drafts, save the date now otherwise it is overriden by WP. Thanks to JoryHogeveen. See #32.
if ( in_array ( 'post_date' , $this -> options [ 'sync' ] ) && isset ( $GLOBALS [ 'pagenow' ], $_GET [ 'from_post' ], $_GET [ 'new_lang' ] ) && 'post-new.php' === $GLOBALS [ 'pagenow' ] ) {
check_admin_referer ( 'new-post-translation' );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
unset ( $postarr [ 'post_date' ] );
unset ( $postarr [ 'post_date_gmt' ] );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
$original = get_post ( ( int ) $_GET [ 'from_post' ] );
if ( $original instanceof WP_Post ) {
$wpdb -> update (
$wpdb -> posts ,
array (
'post_date' => $original -> post_date ,
'post_date_gmt' => $original -> post_date_gmt ,
),
array ( 'ID' => $post -> ID )
);
2021-09-21 15:01:08 +02:00
}
}
2021-09-21 15:06:29 +02:00
if ( isset ( $GLOBALS [ 'post_type' ] ) ) {
$post_type = $GLOBALS [ 'post_type' ];
} elseif ( isset ( $_REQUEST [ 'post_type' ] ) ) {
$post_type = sanitize_key ( $_REQUEST [ 'post_type' ] ); // 2nd case for quick edit
}
// Make sure not to impact media translations when creating them at the same time as post
if ( in_array ( 'post_parent' , $this -> options [ 'sync' ] ) && ( ! isset ( $post_type ) || $post_type !== $post -> post_type ) ) {
unset ( $postarr [ 'post_parent' ] );
}
return $postarr ;
2021-09-21 15:01:08 +02:00
}
/**
2021-09-21 15:06:29 +02:00
* Synchronizes post fields in translations .
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ since 1.2
2021-09-21 15:01:08 +02:00
*
2021-09-21 15:06:29 +02:00
* @ param int $post_id Post id .
* @ param WP_Post $post Post object .
* @ param int [] $translations Post translations .
2021-09-21 15:01:08 +02:00
*/
2021-09-21 15:06:29 +02:00
public function pll_save_post ( $post_id , $post , $translations ) {
parent :: pll_save_post ( $post_id , $post , $translations );
2021-09-21 15:01:08 +02:00
2021-09-21 15:06:29 +02:00
// Sticky posts
if ( in_array ( 'sticky_posts' , $this -> options [ 'sync' ] ) ) {
$stickies = get_option ( 'sticky_posts' );
if ( isset ( $_REQUEST [ 'sticky' ] ) && 'sticky' === $_REQUEST [ 'sticky' ] ) { // phpcs:ignore WordPress.Security.NonceVerification
$stickies = array_merge ( $stickies , array_values ( $translations ) );
} else {
$stickies = array_diff ( $stickies , array_values ( $translations ) );
2021-09-21 15:01:08 +02:00
}
2021-09-21 15:06:29 +02:00
update_option ( 'sticky_posts' , array_unique ( $stickies ) );
2021-09-21 15:01:08 +02:00
}
}
/**
* Some backward compatibility with Polylang < 2.3
* allows to call PLL () -> sync -> copy_post_metas () and PLL () -> sync -> copy_taxonomies ()
* used for example in Polylang for WooCommerce
* the compatibility is however only partial as the 4 th argument $sync is lost
*
* @ since 2.3
*
* @ param string $func Function name
* @ param array $args Function arguments
2021-09-21 15:06:29 +02:00
* @ return mixed | void
2021-09-21 15:01:08 +02:00
*/
public function __call ( $func , $args ) {
$obj = substr ( $func , 5 );
if ( is_object ( $this -> $obj ) && method_exists ( $this -> $obj , 'copy' ) ) {
if ( WP_DEBUG ) {
2021-09-21 15:06:29 +02:00
$debug = debug_backtrace ( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions
2021-09-21 15:01:08 +02:00
$i = 1 + empty ( $debug [ 1 ][ 'line' ] ); // The file and line are in $debug[2] if the function was called using call_user_func
2021-09-21 15:06:29 +02:00
trigger_error ( // phpcs:ignore WordPress.PHP.DevelopmentFunctions
sprintf (
'%1$s was called incorrectly in %3$s on line %4$s: the call to PLL()->sync->%1$s() has been deprecated in Polylang 2.3, use PLL()->sync->%2$s->copy() instead.' . " \n Error handler " ,
esc_html ( $func ),
esc_html ( $obj ),
esc_html ( $debug [ $i ][ 'file' ] ),
absint ( $debug [ $i ][ 'line' ] )
)
);
2021-09-21 15:01:08 +02:00
}
return call_user_func_array ( array ( $this -> $obj , 'copy' ), $args );
}
2021-09-21 15:06:29 +02:00
$debug = debug_backtrace ( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions
trigger_error ( // phpcs:ignore WordPress.PHP.DevelopmentFunctions
sprintf (
'Call to undefined function PLL()->sync->%1$s() in %2$s on line %3$s' . " \n Error handler " ,
esc_html ( $func ),
esc_html ( $debug [ 0 ][ 'file' ] ),
absint ( $debug [ 0 ][ 'line' ] )
),
E_USER_ERROR
);
2021-09-21 15:01:08 +02:00
}
}