晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/rainic/www/oldTZh/wp-content/plugins/duplicate-post/src/handlers/ |
Upload File : |
<?php
namespace Yoast\WP\Duplicate_Post\Handlers;
use WP_Post;
use Yoast\WP\Duplicate_Post\Permissions_Helper;
use Yoast\WP\Duplicate_Post\Utils;
/**
* Duplicate Post handler class for changes overview.
*
* Represents the handler for checking the changes between a copy and the original post.
*
* @since 4.0
*/
class Check_Changes_Handler {
/**
* Holds the permissions helper.
*
* @var Permissions_Helper
*/
protected $permissions_helper;
/**
* Holds the current post object.
*
* @var WP_Post
*/
private $post;
/**
* Holds the original post object.
*
* @var WP_Post
*/
private $original;
/**
* Initializes the class.
*
* @param Permissions_Helper $permissions_helper The Permissions Helper object.
*/
public function __construct( Permissions_Helper $permissions_helper ) {
$this->permissions_helper = $permissions_helper;
}
/**
* Adds hooks to integrate with WordPress.
*
* @return void
*/
public function register_hooks() {
\add_action( 'admin_action_duplicate_post_check_changes', [ $this, 'check_changes_action_handler' ] );
}
/**
* Handles the action for displaying the changes between a copy and the original.
*
* @return void
*/
public function check_changes_action_handler() {
global $wp_version;
if ( ! ( isset( $_GET['post'] ) || isset( $_POST['post'] )
|| ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] === 'duplicate_post_check_changes' ) ) ) {
\wp_die(
\esc_html__( 'No post has been supplied!', 'duplicate-post' )
);
return;
}
$id = ( isset( $_GET['post'] ) ? \intval( \wp_unslash( $_GET['post'] ) ) : \intval( \wp_unslash( $_POST['post'] ) ) );
\check_admin_referer( 'duplicate_post_check_changes_' . $id );
$this->post = \get_post( $id );
if ( ! $this->post ) {
\wp_die(
\esc_html(
\sprintf(
/* translators: %s: post ID. */
\__( 'Changes overview failed, could not find post with ID %s.', 'duplicate-post' ),
$id
)
)
);
return;
}
$this->original = Utils::get_original( $this->post );
if ( ! $this->original ) {
\wp_die(
\esc_html(
\__( 'Changes overview failed, could not find original post.', 'duplicate-post' )
)
);
return;
}
$post_edit_link = \get_edit_post_link( $this->post->ID );
$this->require_wordpress_header();
?>
<div class="wrap">
<h1 class="long-header">
<?php
echo \sprintf(
/* translators: %s: original item link (to view or edit) or title. */
\esc_html__( 'Compare changes of duplicated post with the original (“%s”)', 'duplicate-post' ),
Utils::get_edit_or_view_link( $this->original ) // phpcs:ignore WordPress.Security.EscapeOutput
);
?>
</h1>
<a href="<?php echo \esc_url( $post_edit_link ); ?>"><?php \esc_html_e( '← Return to editor', 'duplicate-post' ); ?></a>
<div class="revisions">
<div class="revisions-control-frame">
<div class="revisions-controls"></div>
</div>
<div class="revisions-diff-frame">
<div class="revisions-diff">
<div class="diff">
<?php
$fields = [
'post_title' => \__( 'Title', 'duplicate-post' ),
'post_content' => \__( 'Content', 'duplicate-post' ),
'post_excerpt' => \__( 'Excerpt', 'duplicate-post' ),
];
$args = [
'show_split_view' => true,
'title_left' => \__( 'Removed', 'duplicate-post' ),
'title_right' => \__( 'Added', 'duplicate-post' ),
];
if ( \version_compare( $wp_version, '5.7' ) < 0 ) {
unset( $args['title_left'] );
unset( $args['title_right'] );
}
$post_array = \get_post( $this->post, \ARRAY_A );
/** This filter is documented in wp-admin/includes/revision.php */
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Reason: using WP core hook.
$fields = \apply_filters( '_wp_post_revision_fields', $fields, $post_array );
foreach ( $fields as $field => $name ) {
/** This filter is documented in wp-admin/includes/revision.php */
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Reason: using WP core hook.
$content_from = \apply_filters( "_wp_post_revision_field_{$field}", $this->original->$field, $field, $this->original, 'from' );
/** This filter is documented in wp-admin/includes/revision.php */
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Reason: using WP core hook.
$content_to = \apply_filters( "_wp_post_revision_field_{$field}", $this->post->$field, $field, $this->post, 'to' );
$diff = \wp_text_diff( $content_from, $content_to, $args );
if ( ! $diff && $field === 'post_title' ) {
// It's a better user experience to still show the Title, even if it didn't change.
$diff = '<table class="diff"><colgroup><col class="content diffsplit left"><col class="content diffsplit middle"><col class="content diffsplit right"></colgroup><tbody><tr>';
$diff .= '<td>' . \esc_html( $this->original->post_title ) . '</td><td></td><td>' . \esc_html( $this->post->post_title ) . '</td>';
$diff .= '</tr></tbody>';
$diff .= '</table>';
}
if ( $diff ) {
?>
<h3><?php echo \esc_html( $name ); ?></h3>
<?php
echo $diff; // phpcs:ignore WordPress.Security.EscapeOutput
}
}
?>
</div>
</div>
</div>
</div>
</div>
<?php
$this->require_wordpress_footer();
}
/**
* Requires the WP admin header.
*
* @codeCoverageIgnore
*
* @return void
*/
public function require_wordpress_header() {
global $post;
\set_current_screen( 'revision' );
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- The revision screen expects $post to be set.
$post = $this->post;
require_once \ABSPATH . 'wp-admin/admin-header.php';
}
/**
* Requires the WP admin footer.
*
* @codeCoverageIgnore
*
* @return void
*/
public function require_wordpress_footer() {
require_once \ABSPATH . 'wp-admin/admin-footer.php';
}
}