llms_txt = new ACSAIV_Llms_Txt(); $this->llms_txt->init(); $faq = new ACSAIV_Faq(); $faq->init(); add_action( 'template_redirect', array( 'ACSAIV_Monitor', 'track' ), 1 ); add_action( 'admin_menu', array( $this, 'add_admin_menu' ) ); add_action( 'admin_init', array( $this, 'register_settings' ) ); add_action( 'admin_init', array( $this, 'maybe_dismiss_review_notice' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); } /** * 同梱の翻訳ファイル(languages/)を読み込む。 */ public function load_textdomain() { load_plugin_textdomain( 'acs-ai-citation-readiness', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); } /** * 管理画面用CSSを自プラグインの画面だけに読み込む。 * * @param string $hook_suffix Current admin page hook. */ public function enqueue_admin_assets( $hook_suffix ) { if ( 'toplevel_page_acs-ai-citation-readiness' !== $hook_suffix ) { return; } wp_enqueue_style( 'acsaiv-admin', ACSAIV_PLUGIN_URL . 'assets/admin.css', array(), ACSAIV_VERSION ); } public function add_admin_menu() { add_menu_page( __( 'ACS AI Citation Readiness', 'acs-ai-citation-readiness' ), __( 'AI Citation Readiness', 'acs-ai-citation-readiness' ), 'manage_options', 'acs-ai-citation-readiness', array( $this, 'render_admin_page' ), 'dashicons-visibility', 81 ); } /** レビュー依頼を閉じたことを保存する option 名。 */ const REVIEW_DISMISSED_OPTION = 'acsaiv_review_notice_dismissed'; /** レビュー依頼の表示開始基準時刻を保存する option 名。 */ const REVIEW_SINCE_OPTION = 'acsaiv_review_notice_since'; /** 表示開始までの待機日数。 */ const REVIEW_DELAY_DAYS = 7; /** * 「閉じる」リンクを処理する。一度閉じたら二度と表示しない。 * * @return void */ public function maybe_dismiss_review_notice() { if ( ! isset( $_GET['acsaiv_dismiss_review'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- 直後に check_admin_referer で検証する。 return; } if ( ! current_user_can( 'manage_options' ) ) { return; } check_admin_referer( 'acsaiv_dismiss_review' ); update_option( self::REVIEW_DISMISSED_OPTION, 1, false ); wp_safe_redirect( admin_url( 'admin.php?page=acs-ai-citation-readiness' ) ); exit; } /** * WordPress.org のレビュー依頼を1行だけ描画する。 * * 表示条件は「このプラグインの管理画面」「manage_options」「まだ閉じていない」 * 「初回表示から7日以上経過」の4つ。外部への送信は一切行わない。 * * @return void */ private function render_review_request() { if ( ! current_user_can( 'manage_options' ) ) { return; } if ( get_option( self::REVIEW_DISMISSED_OPTION ) ) { return; } $since = (int) get_option( self::REVIEW_SINCE_OPTION, 0 ); if ( ! $since ) { $since = time(); update_option( self::REVIEW_SINCE_OPTION, $since, false ); } if ( ( time() - $since ) < self::REVIEW_DELAY_DAYS * DAY_IN_SECONDS ) { return; } $review_url = 'https://wordpress.org/support/plugin/acs-ai-citation-readiness/reviews/#new-post'; $dismiss_url = wp_nonce_url( add_query_arg( array( 'page' => 'acs-ai-citation-readiness', 'acsaiv_dismiss_review' => '1', ), admin_url( 'admin.php' ) ), 'acsaiv_dismiss_review' ); ?>
array( $this, 'sanitize_options' ) ) ); } public function sanitize_options( $input ) { $output = array(); $output['llms_txt_enabled'] = ! empty( $input['llms_txt_enabled'] ) ? 1 : 0; $output['site_description'] = isset( $input['site_description'] ) ? sanitize_textarea_field( $input['site_description'] ) : ''; $output['llms_post_count'] = isset( $input['llms_post_count'] ) ? max( 1, min( 50, (int) $input['llms_post_count'] ) ) : 10; // llms.txt のリライトルールを反映。 flush_rewrite_rules(); return $output; } /** * 管理画面タブの一覧。拡張プラグインは `acsaiv_admin_tabs` フィルタでタブを追加し、 * `acsaiv_render_tab` アクションで本文を描画できる。 */ private function get_tabs() { $tabs = array( 'diagnosis' => __( 'Site Diagnosis', 'acs-ai-citation-readiness' ), 'llms' => 'llms.txt', 'monitor' => __( 'AI Citation Monitoring', 'acs-ai-citation-readiness' ), 'usage' => __( 'How to Use', 'acs-ai-citation-readiness' ), ); return apply_filters( 'acsaiv_admin_tabs', $tabs ); } public function render_admin_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } $tabs = $this->get_tabs(); $active_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'diagnosis'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- 表示切替のみ。 if ( ! isset( $tabs[ $active_tab ] ) ) { $active_tab = 'diagnosis'; } ?>%s
', esc_html( $result->get_error_message() ) ); return; } $labels = array( 'A' => __( 'AI Access Foundation', 'acs-ai-citation-readiness' ), 'B' => __( 'Structure and Citability', 'acs-ai-citation-readiness' ), 'C' => __( 'Trust Signals (E-E-A-T)', 'acs-ai-citation-readiness' ), ); ?>[acsaiv_faq q="Question text" a="Answer text"]