model = $polylang->model; $this->service = $service; $this->curlang = &$polylang->curlang; $this->sync = $polylang->sync; $this->processor = new Processor( $polylang, $this->service->get_client() ); $this->user_meta = new PLL_Toggle_User_Meta( sprintf( 'pll_machine_translation_%s', $this->service->get_slug() ) ); /* * Before `PLL_Duplicate::new_post_translation()`. */ add_filter( 'use_block_editor_for_post', array( $this, 'new_post_translation' ), 1900 ); } /** * Fires the content translation. * * @since 3.6 * * @param bool $is_block_editor Whether the post can be edited or not. * @return bool */ public function new_post_translation( $is_block_editor ) { global $post, $pagenow; // `$post` is the autosave of the new post. if ( $this->done || empty( $post ) || 'post-new.php' !== $pagenow || empty( $_GET['from_post'] ) || empty( $_GET['new_lang'] ) ) { return $is_block_editor; } // Capability check already done in post-new.php. check_admin_referer( 'new-post-translation' ); if ( ! $this->user_meta->is_active() ) { return $is_block_editor; } // Prevent a second translation in the block editor. $this->done = true; if ( ! is_string( $_GET['new_lang'] ) || ! is_numeric( $_GET['from_post'] ) ) { // Invalid data. return $is_block_editor; } $from_post = get_post( (int) $_GET['from_post'] ); if ( ! $from_post instanceof WP_Post ) { // Invalid post. return $is_block_editor; } $target_language = $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ); if ( empty( $target_language ) ) { // Invalid target language. return $is_block_editor; } // No current language during machine translation process (to avoid filtering queries). $current_lang_backup = $this->curlang; $this->curlang = null; $container = new PLL_Export_Container( Data::class ); $export_objects = new PLL_Export_Data_From_Posts( $this->model ); $export_objects->send_to_export( $container, array( $from_post ), $target_language ); // Save translated data. $result = $this->processor->translate( $container ); // All done, set back current language. $this->curlang = $current_lang_backup; if ( $result->has_errors() ) { pll_add_notice( $result ); return $is_block_editor; } $result = $this->processor->save( $container ); if ( $result->has_errors() ) { pll_add_notice( $result ); return $is_block_editor; } // Ensure global post object is updated. $to_post = get_post( (int) $this->model->post->get_translation( $from_post->ID, $target_language ) ); if ( empty( $to_post ) ) { // The translated post doesn't exist anymore for some reason. pll_add_notice( new WP_Error( 'pll_machine_translation_no_translation', __( 'Unable to retrieve the translation.', 'polylang-pro' ) ) ); return $is_block_editor; } $post = $to_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited // Disable duplication. remove_filter( 'use_block_editor_for_post', array( $this->sync, 'new_post_translation' ), 5000 ); add_filter( 'get_user_metadata', array( $this, 'disable_post_duplication' ), 10, 3 ); return $is_block_editor; } /** * Filters the user metas to disable post duplication. * * @since 3.6 * * @param mixed $value The value to return. * @param int $object_id ID of the object metadata is for. * @param string $meta_key Metadata key. * @return mixed False for the post duplication meta, the original value otherwize. */ public function disable_post_duplication( $value, $object_id, $meta_key ) { return 'pll_duplicate_content' === $meta_key ? false : $value; } }