You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

330 lines
8.0 KiB
PHP

<?php
namespace RT\ThePostGrid\Controllers\Api;
use Exception;
use RT\ThePostGrid\Helpers\Fns;
use WP_REST_Request;
use WP_REST_Server;
class RttpgV1 {
public function register_routes() {
// For css file save
register_rest_route(
'rttpg/v1',
'/block-save-css/',
[
[
'methods' => 'POST',
'callback' => [ $this, 'save_block_css' ],
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
'args' => [],
],
]
);
// Get the Content by ID
register_rest_route(
'rttpg/v1',
'/get-post-content/',
[
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'get_post_content' ],
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
'args' => [],
],
]
);
// Append Block CSS
register_rest_route(
'rttpg/v1',
'/block-append-css/',
[
[
'methods' => 'POST',
'callback' => [ $this, 'append_block_css_callback' ],
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
'args' => [],
],
]
);
register_rest_route(
'rttpg/v1',
'/block-append-reusable-css/',
[
[
'methods' => 'POST',
'callback' => [ $this, 'append_reusable_css_callback' ],
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
'args' => [],
],
]
);
}
/**
* Get post content
*
* @param WP_REST_Request $request Wp $request variable
*
* @return array|void
*/
public function get_post_content( WP_REST_Request $request ) {
$params = $request->get_params();
try {
if ( isset( $params['postId'] ) ) {
return [
'success' => true,
'data' => ! empty( $params['postId'] ) ? get_post( $params['postId'] )->post_content : '',
'message' => 'Get Data Success!!',
];
}
} catch ( Exception $e ) {
return [
'success' => false,
'message' => $e->getMessage(),
];
}
}
/**
* Save block css for each post in a css file and enqueue the file to the post page
*
* @param WP_REST_Request $request
*
* @return array
*/
public function save_block_css( WP_REST_Request $request ) {
try {
global $wp_filesystem;
if ( ! $wp_filesystem ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
$params = $request->get_params();
$post_id = (int) sanitize_text_field( $params['post_id'] );
$is_previewing = $params['isPreviewing'];
if ( $params['is_remain'] ) {
$block_css = $params['block_css'];
$filename = "rttpg-block-{$post_id}.css";
$upload_dir = wp_upload_dir();
$dir = trailingslashit( $upload_dir['basedir'] ) . 'rttpg/';
// Add Import in first
$import_first = $this->set_import_url_to_top_css( $block_css );
if ( true === $is_previewing ) {
$filename = 'rttpg-block-preview.css';
} else {
update_post_meta( $post_id, '_rttpg_block_css', $import_first );
}
WP_Filesystem( false, $upload_dir['basedir'], true );
if ( ! $wp_filesystem->is_dir( $dir ) ) {
$wp_filesystem->mkdir( $dir );
}
// If fail to save css in directory, then it will show a message to user
if ( ! $wp_filesystem->put_contents( $dir . $filename, $import_first ) ) {
throw new Exception( __( 'CSS can not be saved due to permission!!!', 'the-post-grid' ) );
}
} else {
if ( false === $is_previewing ) {
delete_post_meta( $post_id, '_rttpg_block_css' );
$this->delete_post_resource( $post_id );
}
}
$success_message = __( 'The Post Grid preview css file has been updated.', 'the-post-grid' );
// set block meta
if ( false === $is_previewing ) {
// ignore: phpcs
update_post_meta( $post_id, '__rttpg_available_blocks', serialize( $params['available_blocks'] ) );
$success_message = __( 'The Post Grid block css file has been updated.', 'the-post-grid' );
}
return [
'success' => true,
'message' => $success_message,
'data' => $params,
];
} catch ( Exception $e ) {
return [
'success' => false,
'message' => $e->getMessage(),
];
}
}
/**
* @param string $get_css
*
* @return mixed|string
*/
public function set_import_url_to_top_css( $get_css = '' ) {
$css_url = "@import url('https://fonts.googleapis.com/css?family=";
$google_font_exists = substr_count( $get_css, $css_url );
if ( $google_font_exists ) {
$pattern = sprintf(
'/%s(.+?)%s/ims',
preg_quote( $css_url, '/' ),
preg_quote( "');", '/' )
);
if ( preg_match_all( $pattern, $get_css, $matches ) ) {
$fonts = $matches[0];
$get_css = str_replace( $fonts, '', $get_css );
if ( preg_match_all( '/font-weight[ ]?:[ ]?[\d]{3}[ ]?;/', $get_css, $matche_weight ) ) { // short out font weight
$weight = array_map(
function ( $val ) {
$process = trim( str_replace( [ 'font-weight', ':', ';' ], '', $val ) );
if ( is_numeric( $process ) ) {
return $process;
}
},
$matche_weight[0]
);
foreach ( $fonts as $key => $val ) {
$fonts[ $key ] = str_replace( "');", '', $val ) . ':' . implode( ',', $weight ) . "');";
}
}
// Multiple same fonts to single font
$fonts = array_unique( $fonts );
$get_css = implode( '', $fonts ) . $get_css;
}
}
return $get_css;
}
/**
* Delete post related data
*
* @delete post css file
*/
private function delete_post_resource( $post_id = '' ) {
$post_id = $post_id ? $post_id : $this->is_single();
if ( $post_id ) {
$upload_dir = wp_upload_dir()['basedir'] . '/rttpg/';
$css_path = $upload_dir . 'rttpg-block-' . $post_id . '.css';
if ( file_exists( $css_path ) ) {
unlink( $css_path );
}
}
}
/**
* Determine if current single page is WP Page Builder Page
*
* @return bool|false|int
*/
private function is_single() {
$post_id = get_the_ID();
if ( ! $post_id ) {
return false;
}
return $post_id;
}
/**
* @param WP_REST_Request $request
*
* @return void
*/
public function append_block_css_callback( WP_REST_Request $request ) {
try {
global $wp_filesystem;
if ( ! $wp_filesystem ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
$params = $request->get_params();
$css = $params['css'];
$post_id = (int) sanitize_text_field( $params['post_id'] );
if ( $post_id ) {
$filename = "block-css-{$post_id}.css";
$upload_dir = wp_upload_dir();
$dir = trailingslashit( $upload_dir['basedir'] ) . 'rttpg/';
if ( file_exists( $dir . $filename ) ) {
$file = fopen( $dir . $filename, 'a' );
fwrite( $file, $css );
fclose( $file );
}
$get_data = get_post_meta( $post_id, '_rttpg_block_css', true );
update_post_meta( $post_id, '_rttpg_block_css', $get_data . $css );
wp_send_json_success(
[
'success' => true,
'message' => 'Update done' . $get_data,
]
);
}
} catch ( Exception $e ) {
wp_send_json_error(
[
'success' => false,
'message' => $e->getMessage(),
]
);
}
}
/**
* @param WP_REST_Request $request
*
* @return void
*/
public function append_reusable_css_callback( $request ) {
try {
global $wp_filesystem;
if ( ! $wp_filesystem ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
$params = $request->get_params();
$css = $params['css'];
$filename = 'blocks-preview.css';
$upload_dir = wp_upload_dir();
$dir = trailingslashit( $upload_dir['basedir'] ) . 'rttpg/';
if ( file_exists( $dir . $filename ) ) {
$file = fopen( $dir . $filename, 'a' );
fwrite( $file, $css );
fclose( $file );
}
wp_send_json_success(
[
'success' => true,
'message' => 'appended reusable css in preview file',
]
);
} catch ( Exception $e ) {
wp_send_json_error(
[
'success' => false,
'message' => $e->getMessage(),
]
);
}
}
}