晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
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/elementor-pro/modules/screenshots/ |
Upload File : |
<?php
namespace ElementorPro\Modules\Screenshots;
use ElementorPro\Base\Module_Base;
use Elementor\Core\Frontend\Render_Mode_Manager;
use ElementorPro\Core\Utils;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class Module extends Module_Base {
const SCREENSHOT_PROXY_NONCE_ACTION = 'screenshot_proxy';
/**
* Module name.
*
* @return string
*/
public function get_name() {
return 'screenshots';
}
/**
* Creates proxy for css and images,
* dom to image libraries cannot load content from another origin.
*
* @param $url
*
* @return string
*/
public function get_proxy_data( $url ) {
$response = wp_safe_remote_get( utf8_decode( $url ) );
if ( is_wp_error( $response ) ) {
return '';
}
$content_type = wp_remote_retrieve_headers( $response )->offsetGet( 'content-type' );
header( 'content-type: ' . $content_type );
return wp_remote_retrieve_body( $response );
}
/**
* Save screenshot and attached it to the post.
*
* @param $data
*
* @return bool|string
* @throws \Exception
*/
public function ajax_save( $data ) {
if ( empty( $data['screenshot'] ) || empty( $data['post_id'] ) ) {
return false;
}
if ( ! $this->can_user_manage_screenshots( $data['post_id'] ) ) {
return false;
}
$screenshot = new Screenshot( $data['post_id'], $data['screenshot'] );
$screenshot
->create_dir()
->upload()
->remove_old_attachment()
->create_new_attachment()
->unmark_as_failed();
return $screenshot->get_screenshot_url();
}
/**
* Remove the screenshot image and the attachment data.
*
* @param $data
*
* @return bool
*/
public function ajax_delete( $data ) {
if ( empty( $data['post_id'] ) ) {
return false;
}
if ( ! $this->can_user_manage_screenshots( $data['post_id'] ) ) {
return false;
}
$screenshot = new Screenshot( $data['post_id'] );
$screenshot
->remove_old_attachment()
->remove_old_post_meta()
->unmark_as_failed();
return true;
}
/**
* Mark screenshot as failed.
*
* @param $data
*
* @return bool
*/
public function ajax_screenshot_failed( $data ) {
if ( empty( $data['post_id'] ) ) {
return false;
}
if ( ! $this->can_user_manage_screenshots( $data['post_id'] ) ) {
return false;
}
$screenshot = new Screenshot( $data['post_id'] );
$screenshot->mark_as_failed();
return true;
}
/**
* Extends the json of the templates.
* sets a screenshot as a thumbnail if exists, and if not will add a url to generate screenshot for
* the specific template.
*
* @param array $template
*
* @return array
*/
public function extend_templates_json_structure( $template ) {
if ( ! empty( $template['thumbnail'] ) ) {
return $template;
}
$attachment_data = get_post_meta( $template['id'], Screenshot::POST_META_KEY, true );
if ( isset( $attachment_data['url'] ) ) {
$template['thumbnail'] = $attachment_data['url'];
return $template;
}
$failed_to_create_screenshot = get_post_meta( $template['id'], Screenshot::FAILED_POST_META_KEY, true );
// If it failed to create screenshot before, it should not set screenshot_url, and should not try
// to create another screenshot until the next edit of the template.
if ( ! $failed_to_create_screenshot ) {
$template['screenshot_url'] = Render_Mode_Screenshot::get_url( $template['id'] );
}
return $template;
}
/**
* @param \WP_Query $query
*/
public function filter_screenshots_from_attachments_query( \WP_Query $query ) {
global $pagenow, $typenow;
if ( 'upload.php' !== $pagenow || 'attachment' !== $typenow ) {
return;
}
if ( empty( $query->query_vars['meta_query'] ) ) {
$query->query_vars['meta_query'] = [];
}
$query->query_vars['meta_query'][] = [
'key' => Screenshot::IS_SCREENSHOT_POST_META_KEY,
'compare' => 'NOT EXISTS',
];
}
public function filter_screenshots_from_ajax_attachments_query( $query ) {
if ( empty( $query['meta_query'] ) ) {
$query['meta_query'] = [];
}
$query['meta_query'][] = [
'key' => Screenshot::IS_SCREENSHOT_POST_META_KEY,
'compare' => 'NOT EXISTS',
];
return $query;
}
/**
* Register screenshots action.
*
* @param \Elementor\Core\Common\Modules\Ajax\Module $ajax_manager
*/
public function register_ajax_actions( $ajax_manager ) {
$ajax_manager->register_ajax_action( 'screenshot_save', [ $this, 'ajax_save' ] );
$ajax_manager->register_ajax_action( 'screenshot_delete', [ $this, 'ajax_delete' ] );
$ajax_manager->register_ajax_action( 'screenshot_failed', [ $this, 'ajax_screenshot_failed' ] );
}
/**
* @param Render_Mode_Manager $manager
*
* @throws \Exception
*/
public function register_render_mode( Render_Mode_Manager $manager ) {
$manager->register_render_mode( Render_Mode_Screenshot::class );
}
/**
* Check and validate proxy mode.
*
* @param array $query_params
*
* @return bool
* @throws \Requests_Exception_HTTP_400
* @throws \Requests_Exception_HTTP_403
* @throws Status400
* @throws Status403
*/
protected function is_screenshot_proxy_mode( array $query_params ) {
$is_proxy = isset( $query_params['screenshot_proxy'] );
if ( $is_proxy ) {
if ( ! wp_verify_nonce( $query_params['nonce'], self::SCREENSHOT_PROXY_NONCE_ACTION ) ) {
// WP >= 6.2-alpha
if ( class_exists( '\WpOrg\Requests\Exception\Http\Status403' ) ) {
throw new \WpOrg\Requests\Exception\Http\Status403();
} else {
throw new \Requests_Exception_HTTP_403();
}
}
if ( ! $query_params['href'] ) {
// WP >= 6.2-alpha
if ( class_exists( '\WpOrg\Requests\Exception\Http\Status400' ) ) {
throw new \WpOrg\Requests\Exception\Http\Status400();
} else {
throw new \Requests_Exception_HTTP_400();
}
}
}
return $is_proxy;
}
/**
* @param $post_id
*
* @return bool
* @throws \Exception
*/
private function can_user_manage_screenshots( $post_id ) {
return Utils::_unstable_get_document_for_edit( $post_id ) && current_user_can( 'upload_files' );
}
/**
* Module constructor.
*/
public function __construct() {
parent::__construct();
if ( $this->is_screenshot_proxy_mode( $_GET ) ) { // phpcs:ignore -- Checking nonce inside the method.
echo $this->get_proxy_data( htmlspecialchars( $_GET['href'] ) ); // phpcs:ignore -- Nonce was checked on the above method
die;
}
add_action( 'elementor/frontend/render_mode/register', [ $this, 'register_render_mode' ] );
add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_actions' ] );
add_action( 'parse_query', [ $this, 'filter_screenshots_from_attachments_query' ] );
add_filter( 'ajax_query_attachments_args', [ $this, 'filter_screenshots_from_ajax_attachments_query' ] );
add_filter( 'elementor-pro/site-editor/data/template', [ $this, 'extend_templates_json_structure' ] );
}
}