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.
375 lines
10 KiB
PHTML
375 lines
10 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The Role Manager Module.
|
||
|
*
|
||
|
* @since 0.9.0
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Content_AI_Page
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\ContentAI;
|
||
|
|
||
|
use RankMath\ContentAI\Content_AI;
|
||
|
use RankMath\Helper;
|
||
|
use RankMath\Traits\Hooker;
|
||
|
use RankMath\Admin\Page;
|
||
|
use RankMath\Helpers\Param;
|
||
|
use WP_Block_Editor_Context;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Content_AI_Page class.
|
||
|
*/
|
||
|
class Content_AI_Page {
|
||
|
use Hooker;
|
||
|
|
||
|
/**
|
||
|
* The Constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
$this->action( 'rank_math/admin_bar/items', 'admin_bar_items', 11 );
|
||
|
$this->action( 'rank_math/admin/editor_scripts', 'enqueue' );
|
||
|
$this->action( 'init', 'init' );
|
||
|
$this->filter( 'wp_insert_post_data', 'remove_unused_generated_content' );
|
||
|
$this->filter( 'rank_math/database/tools', 'add_tools' );
|
||
|
$this->filter( 'rank_math/tools/content_ai_cancel_bulk_edit_process', 'cancel_bulk_edit_process' );
|
||
|
|
||
|
if ( Param::get( 'page' ) !== 'rank-math-content-ai-page' ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$this->action( 'rank_math/before_help_link', 'add_credits_remaining' );
|
||
|
$this->action( 'admin_footer', 'content_editor_settings' );
|
||
|
add_filter( 'should_load_block_editor_scripts_and_styles', '__return_true' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Init function.
|
||
|
*/
|
||
|
public function init() {
|
||
|
$this->register_post_type();
|
||
|
$this->register_admin_page();
|
||
|
Block_Command::get();
|
||
|
Bulk_Edit_SEO_Meta::get();
|
||
|
Event_Scheduler::get();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add Credits remaining text before the help link in the admin header.
|
||
|
*/
|
||
|
public function add_credits_remaining() {
|
||
|
// Early bail if site is not connected or doesn't have a Content AI Plan.
|
||
|
if ( ! Helper::is_site_connected() || ! Helper::get_content_ai_plan() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$credits = Helper::get_credits();
|
||
|
?>
|
||
|
<div class="credits-remaining">
|
||
|
<?php echo esc_html__( 'Credits Remaining: ', 'rank-math' ); ?>
|
||
|
<strong><?php echo esc_html( $credits ); ?></strong>
|
||
|
</div>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enqueue Content AI Page CSS.
|
||
|
*/
|
||
|
public function enqueue() {
|
||
|
wp_enqueue_style(
|
||
|
'rank-math-content-ai-page',
|
||
|
rank_math()->plugin_url() . 'includes/modules/content-ai/assets/css/content-ai-page.css',
|
||
|
[ 'rank-math-common' ],
|
||
|
rank_math()->version
|
||
|
);
|
||
|
|
||
|
wp_enqueue_script(
|
||
|
'rank-math-content-ai-page',
|
||
|
rank_math()->plugin_url() . 'includes/modules/content-ai/assets/js/content-ai-page.js',
|
||
|
[
|
||
|
'lodash',
|
||
|
'wp-dom-ready',
|
||
|
'rank-math-content-ai',
|
||
|
],
|
||
|
rank_math()->version,
|
||
|
true
|
||
|
);
|
||
|
|
||
|
wp_set_script_translations( 'rank-math-content-ai-page', 'rank-math' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register admin page.
|
||
|
*/
|
||
|
public function register_admin_page() {
|
||
|
$uri = untrailingslashit( plugin_dir_url( __FILE__ ) );
|
||
|
|
||
|
$new_label = '<span class="rank-math-new-label" style="color:#ed5e5e;font-size:10px;font-weight:normal;">' . esc_html__( 'New!', 'rank-math' ) . '</span>';
|
||
|
|
||
|
if ( 'rank-math-content-ai-page' === Param::get( 'page' ) ) {
|
||
|
Helper::add_json( 'isContentAIPage', true );
|
||
|
Content_AI::localized_data();
|
||
|
}
|
||
|
|
||
|
new Page(
|
||
|
'rank-math-content-ai-page',
|
||
|
esc_html__( 'Content AI', 'rank-math' ),
|
||
|
[
|
||
|
'position' => 4,
|
||
|
'parent' => 'rank-math',
|
||
|
// Translators: placeholder is the new label.
|
||
|
'menu_title' => sprintf( esc_html__( 'Content AI %s', 'rank-math' ), $new_label ),
|
||
|
'capability' => 'rank_math_content_ai',
|
||
|
'render' => dirname( __FILE__ ) . '/views/main.php',
|
||
|
'classes' => [ 'rank-math-page' ],
|
||
|
'assets' => [
|
||
|
'styles' => [
|
||
|
'wp-edit-post' => '',
|
||
|
'rank-math-common' => '',
|
||
|
'rank-math-cmb2' => '',
|
||
|
'wp-block-library' => '',
|
||
|
'rank-math-content-ai-page' => $uri . '/assets/css/content-ai-page.css',
|
||
|
],
|
||
|
'scripts' => [
|
||
|
'lodash' => '',
|
||
|
'wp-components' => '',
|
||
|
'wp-block-library' => '',
|
||
|
'wp-format-library' => '',
|
||
|
'wp-edit-post' => '',
|
||
|
'wp-blocks' => '',
|
||
|
'wp-element' => '',
|
||
|
'wp-editor' => '',
|
||
|
'rank-math-block-faq' => rank_math()->plugin_url() . 'assets/admin/js/blocks.js',
|
||
|
'rank-math-analyzer' => rank_math()->plugin_url() . 'assets/admin/js/analyzer.js',
|
||
|
'rank-math-content-ai' => rank_math()->plugin_url() . 'includes/modules/content-ai/assets/js/content-ai.js',
|
||
|
'rank-math-content-ai-page' => $uri . '/assets/js/content-ai-page.js',
|
||
|
],
|
||
|
],
|
||
|
]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add admin bar item.
|
||
|
*
|
||
|
* @param Admin_Bar_Menu $menu Menu class instance.
|
||
|
*/
|
||
|
public function admin_bar_items( $menu ) {
|
||
|
$url = Helper::get_admin_url( 'content-ai-page' );
|
||
|
$menu->add_sub_menu(
|
||
|
'content-ai-page',
|
||
|
[
|
||
|
'title' => esc_html__( 'Content AI', 'rank-math' ),
|
||
|
'href' => $url,
|
||
|
'priority' => 50,
|
||
|
]
|
||
|
);
|
||
|
|
||
|
$items = [
|
||
|
'content-ai-tools' => [
|
||
|
'title' => esc_html__( 'AI Tools', 'rank-math' ),
|
||
|
'href' => $url . '#ai-tools',
|
||
|
'meta' => [ 'title' => esc_html__( 'Content AI Tools', 'rank-math' ) ],
|
||
|
],
|
||
|
|
||
|
'content-ai-editor' => [
|
||
|
'title' => esc_html__( 'Content Editor', 'rank-math' ),
|
||
|
'href' => $url . '#content-editor',
|
||
|
'meta' => [ 'title' => esc_html__( 'Content AI Editor', 'rank-math' ) ],
|
||
|
],
|
||
|
|
||
|
'content-ai-chat' => [
|
||
|
'title' => esc_html__( 'Chat', 'rank-math' ),
|
||
|
'href' => $url . '#chat',
|
||
|
'meta' => [ 'title' => esc_html__( 'Content AI Chat', 'rank-math' ) ],
|
||
|
],
|
||
|
|
||
|
'content-ai-history' => [
|
||
|
'title' => esc_html__( 'History', 'rank-math' ),
|
||
|
'href' => $url . '#history',
|
||
|
'meta' => [ 'title' => esc_html__( 'Content AI History', 'rank-math' ) ],
|
||
|
],
|
||
|
];
|
||
|
|
||
|
foreach ( $items as $id => $args ) {
|
||
|
$menu->add_sub_menu( $id, $args, 'content-ai-page' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add Content Editor Settings.
|
||
|
*/
|
||
|
public function content_editor_settings() {
|
||
|
$post = $this->get_content_editor_post();
|
||
|
$block_editor_context = new WP_Block_Editor_Context( [ 'post' => [] ] );
|
||
|
|
||
|
// Flag that we're loading the block editor.
|
||
|
$current_screen = get_current_screen();
|
||
|
$current_screen->is_block_editor( true );
|
||
|
|
||
|
$editor_settings = [
|
||
|
'availableTemplates' => [],
|
||
|
'disablePostFormats' => true,
|
||
|
'autosaveInterval' => 0,
|
||
|
'richEditingEnabled' => user_can_richedit(),
|
||
|
'supportsLayout' => function_exists( 'wp_theme_has_theme_json' ) ? wp_theme_has_theme_json() : false,
|
||
|
'supportsTemplateMode' => false,
|
||
|
'enableCustomFields' => false,
|
||
|
];
|
||
|
|
||
|
$editor_settings = get_block_editor_settings( $editor_settings, $block_editor_context );
|
||
|
|
||
|
/**
|
||
|
* Scripts
|
||
|
*/
|
||
|
wp_enqueue_media( [ 'post' => $post->ID ] );
|
||
|
?>
|
||
|
|
||
|
<div id="editor2" data-settings='<?php echo esc_attr( wp_json_encode( $editor_settings ) ); ?>' data-post-id="<?php echo esc_attr( $post->ID ); ?>"></div>
|
||
|
<?php
|
||
|
|
||
|
wp_set_script_translations( 'rank-math-content-ai', 'rank-math' );
|
||
|
wp_set_script_translations( 'rank-math-content-ai-page', 'rank-math' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove unsed content generated from the Toolbar option of the Content AI.
|
||
|
*
|
||
|
* @param array $data An array of slashed, sanitized, and processed post data.
|
||
|
*/
|
||
|
public function remove_unused_generated_content( $data ) {
|
||
|
$blocks = parse_blocks( $data['post_content'] );
|
||
|
if ( empty( $blocks ) ) {
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
$update = false;
|
||
|
foreach ( $blocks as $key => $block ) {
|
||
|
if ( 'rank-math/command' === $block['blockName'] ) {
|
||
|
unset( $blocks[ $key ] );
|
||
|
$update = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( $update ) {
|
||
|
$data['post_content'] = serialize_blocks( $blocks );
|
||
|
}
|
||
|
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add database tools.
|
||
|
*
|
||
|
* @param array $tools Array of tools.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function add_tools( $tools ) {
|
||
|
$posts = get_option( 'rank_math_content_ai_posts' );
|
||
|
|
||
|
// Early Bail if process is not running.
|
||
|
if ( empty( $posts ) ) {
|
||
|
return $tools;
|
||
|
}
|
||
|
|
||
|
$processed = get_option( 'rank_math_content_ai_posts_processed' );
|
||
|
|
||
|
$tools['content_ai_cancel_bulk_edit_process'] = [
|
||
|
'title' => esc_html__( 'Cancel Content AI Bulk Editing Process', 'rank-math' ),
|
||
|
'description' => sprintf(
|
||
|
// Translators: placeholders are the number of posts that were processed.
|
||
|
esc_html__( 'Terminate the ongoing Content AI Bulk Editing Process to halt any pending modifications and revert to the previous state. The bulk metadata has been generated for %1$d out of %1$d posts so far.', 'rank-math' ),
|
||
|
$processed,
|
||
|
count( $posts )
|
||
|
),
|
||
|
'button_text' => esc_html__( 'Terminate', 'rank-math' ),
|
||
|
];
|
||
|
|
||
|
return $tools;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function to cancel the Bulk Edit process.
|
||
|
*/
|
||
|
public function cancel_bulk_edit_process() {
|
||
|
Bulk_Edit_SEO_Meta::get()->cancel();
|
||
|
Helper::remove_notification( 'rank_math_content_ai_posts_started' );
|
||
|
return __( 'Bulk Editing Process Successfully Cancelled', 'rank-math' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register Content AI post type to use the post in Content Editor.
|
||
|
*/
|
||
|
private function register_post_type() {
|
||
|
register_post_type(
|
||
|
'rm_content_editor',
|
||
|
[
|
||
|
'label' => 'RM Content Editor',
|
||
|
'public' => false,
|
||
|
'publicly_queryable' => false,
|
||
|
'show_ui' => false,
|
||
|
'show_in_rest' => true,
|
||
|
'has_archive' => false,
|
||
|
'show_in_menu' => false,
|
||
|
'show_in_nav_menus' => false,
|
||
|
'delete_with_user' => false,
|
||
|
'exclude_from_search' => false,
|
||
|
'capability_type' => 'page',
|
||
|
'map_meta_cap' => true,
|
||
|
'hierarchical' => false,
|
||
|
'rewrite' => false,
|
||
|
'query_var' => false,
|
||
|
'supports' => [ 'editor' ],
|
||
|
]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Content Editor post.
|
||
|
*
|
||
|
* @return int Post ID.
|
||
|
*/
|
||
|
private function get_content_editor_post() {
|
||
|
$posts = get_posts(
|
||
|
[
|
||
|
'post_type' => 'rm_content_editor',
|
||
|
'numberposts' => 1,
|
||
|
'post_status' => 'any',
|
||
|
]
|
||
|
);
|
||
|
|
||
|
if ( empty( $posts ) ) {
|
||
|
$post_id = wp_insert_post(
|
||
|
[
|
||
|
'post_type' => 'rm_content_editor',
|
||
|
'post_content' => '<!-- wp:rank-math/command /-->',
|
||
|
]
|
||
|
);
|
||
|
|
||
|
return get_post( $post_id );
|
||
|
}
|
||
|
|
||
|
$ai_post = current( $posts );
|
||
|
$content = $ai_post->post_content;
|
||
|
$blocks = parse_blocks( $content );
|
||
|
if ( ! empty( $blocks ) && count( $blocks ) < 2 && 'core/paragraph' === $blocks[0]['blockName'] ) {
|
||
|
$content = do_blocks( $ai_post->post_content );
|
||
|
$content = trim( preg_replace( '/<p[^>]*><\\/p[^>]*>/', '', $content ) );
|
||
|
}
|
||
|
|
||
|
if ( ! $content ) {
|
||
|
wp_update_post(
|
||
|
[
|
||
|
'ID' => $ai_post->ID,
|
||
|
'post_content' => '<!-- wp:rank-math/command /-->',
|
||
|
]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return $ai_post;
|
||
|
}
|
||
|
}
|