*/
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();
?>
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 = '' . esc_html__( 'New!', 'rank-math' ) . '';
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 ] );
?>
$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' => '',
]
);
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[^>]*>/', '', $content ) );
}
if ( ! $content ) {
wp_update_post(
[
'ID' => $ai_post->ID,
'post_content' => '',
]
);
}
return $ai_post;
}
}