Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/slim-seo/js/build/meta-tags.asset.php
+++ b/slim-seo/js/build/meta-tags.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '2ac7a8049ca80912cd62');
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => 'ba9f9570dae870391040');
--- a/slim-seo/js/build/single.asset.php
+++ b/slim-seo/js/build/single.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => 'eef40a2f71c4eaea0a70');
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '1ad5b9cd3d9b785044fd');
--- a/slim-seo/slim-seo.php
+++ b/slim-seo/slim-seo.php
@@ -5,7 +5,7 @@
* Description: A fast and automated SEO plugin for WordPress.
* Author: Slim SEO
* Author URI: https://wpslimseo.com/?utm_source=plugin_links&utm_medium=link&utm_campaign=slim_seo
- * Version: 4.9.8
+ * Version: 4.9.9
* License: GPL v3
*
* Copyright (C) 2010-2025 Tran Ngoc Tuan Anh. All rights reserved.
@@ -32,7 +32,7 @@
define( 'SLIM_SEO_URL', plugin_dir_url( __FILE__ ) );
define( 'SLIM_SEO_REDIRECTS', 'ss_redirects' );
define( 'SLIM_SEO_DELETE_404_LOGS_ACTION', 'delete_404_logs' );
-define( 'SLIM_SEO_VER', '4.9.8' );
+define( 'SLIM_SEO_VER', '4.9.9' );
define( 'SLIM_SEO_DB_VER', 2 );
require __DIR__ . '/vendor/autoload.php';
--- a/slim-seo/src/Integrations/ACF/Renderer.php
+++ b/slim-seo/src/Integrations/ACF/Renderer.php
@@ -13,7 +13,7 @@
}
public function __get( $name ) {
- $field = $this->field_objects[ $name ] ?: null;
+ $field = $this->field_objects[ $name ] ?? null;
if ( ! $field ) {
return null;
--- a/slim-seo/src/Integrations/SenseiLMS.php
+++ b/slim-seo/src/Integrations/SenseiLMS.php
@@ -11,8 +11,8 @@
}
/**
- * Don't parse AffiliateWP shortcodes for meta description.
- * @link https://affiliatewp.com/doc-categories/shortcodes/
+ * Don't parse Sensei LMS shortcodes for meta description.
+ * @link https://senseilms.com/documentation/shortcodes/
*/
public function skip_shortcodes( $shortcodes ) {
$shortcodes = array_merge( $shortcodes, [
--- a/slim-seo/src/MetaTags/AI.php
+++ b/slim-seo/src/MetaTags/AI.php
@@ -16,6 +16,7 @@
public function register_routes(): void {
register_rest_route( 'slim-seo', 'meta-tags/ai', [
+ 'show_in_index' => false,
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'generate' ],
'permission_callback' => function () {
@@ -24,6 +25,7 @@
] );
register_rest_route( 'slim-seo', 'ai/models', [
+ 'show_in_index' => false,
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_models' ],
'permission_callback' => function () {
@@ -52,7 +54,13 @@
$type = $request->get_param( 'type' ) === 'description' ? 'description' : 'title';
if ( 'post' === ( $object['type'] ?? '' ) ) {
- $content = Data::get_post_content( $object['ID'] ?? 0, $content );
+ $post_id = (int) ( $object['ID'] ?? 0 );
+
+ if ( $post_id <= 0 || ! current_user_can( 'edit_post', $post_id ) ) {
+ return $this->response( __( 'You are not allowed to generate meta tags for this post.', 'slim-seo' ) );
+ }
+
+ $content = Data::get_post_content( $post_id, $content );
}
// Preprocess content: strip HTML, normalize whitespace, limit length
@@ -192,7 +200,7 @@
// Validate model - use default if empty
if ( empty( $model ) ) {
$models = $provider_obj->get_models();
- $model = $models[0]['value'] ?? '';
+ $model = $models[0] ?? '';
}
if ( empty( $model ) ) {
--- a/slim-seo/src/MetaTags/AiProviders/Anthropic.php
+++ b/slim-seo/src/MetaTags/AiProviders/Anthropic.php
@@ -33,20 +33,16 @@
return $response['content'][0]['text'] ?? '';
}
+ /**
+ * @link https://platform.claude.com/docs/en/about-claude/models/overview
+ */
public function get_models(): array {
return [
- [
- 'value' => 'claude-opus-4-6',
- 'label' => 'Claude Opus 4.6',
- ],
- [
- 'value' => 'claude-sonnet-4-6',
- 'label' => 'Claude Sonnet 4.6',
- ],
- [
- 'value' => 'claude-haiku-4-5',
- 'label' => 'Claude Haiku 4.5',
- ],
+ 'claude-fable-5',
+ 'claude-mythos-5',
+ 'claude-opus-4-8',
+ 'claude-sonnet-4-6',
+ 'claude-haiku-4-5',
];
}
}
--- a/slim-seo/src/MetaTags/AiProviders/Google.php
+++ b/slim-seo/src/MetaTags/AiProviders/Google.php
@@ -39,32 +39,18 @@
return $response['candidates'][0]['content']['parts'][0]['text'] ?? '';
}
+ /**
+ * @link https://ai.google.dev/gemini-api/docs/models
+ */
public function get_models(): array {
return [
- [
- 'value' => 'gemini-3.1-pro-preview',
- 'label' => 'Gemini 3.1 Pro Preview',
- ],
- [
- 'value' => 'gemini-3.1-flash-preview',
- 'label' => 'Gemini 3.1 Flash Preview',
- ],
- [
- 'value' => 'gemini-3.1-flash-lite-preview',
- 'label' => 'Gemini 3.1 Flash Lite Preview',
- ],
- [
- 'value' => 'gemini-2.5-pro',
- 'label' => 'Gemini 2.5 Pro',
- ],
- [
- 'value' => 'gemini-2.5-flash',
- 'label' => 'Gemini 2.5 Flash',
- ],
- [
- 'value' => 'gemini-2.5-flash-lite',
- 'label' => 'Gemini 2.5 Flash Lite',
- ],
+ 'gemini-3.5-flash',
+ 'gemini-3.1-pro-preview',
+ 'gemini-3.1-flash-preview',
+ 'gemini-3.1-flash-lite',
+ 'gemini-2.5-pro',
+ 'gemini-2.5-flash',
+ 'gemini-2.5-flash-lite',
];
}
}
--- a/slim-seo/src/MetaTags/AiProviders/OpenAI.php
+++ b/slim-seo/src/MetaTags/AiProviders/OpenAI.php
@@ -49,52 +49,23 @@
return implode( ' ', $texts );
}
+ /**
+ * @link https://developers.openai.com/api/docs/models/all
+ */
public function get_models(): array {
return [
- [
- 'value' => 'gpt-5.4',
- 'label' => 'GPT-5.4',
- ],
- [
- 'value' => 'gpt-5.4-mini',
- 'label' => 'GPT-5.4 Mini',
- ],
- [
- 'value' => 'gpt-5.4-nano',
- 'label' => 'GPT-5.4 Nano',
- ],
- [
- 'value' => 'gpt-5',
- 'label' => 'GPT-5',
- ],
- [
- 'value' => 'gpt-5-mini',
- 'label' => 'GPT-5 Mini',
- ],
- [
- 'value' => 'gpt-5-nano',
- 'label' => 'GPT-5 Nano',
- ],
- [
- 'value' => 'gpt-4.1',
- 'label' => 'GPT-4.1',
- ],
- [
- 'value' => 'gpt-4.1-mini',
- 'label' => 'GPT-4.1 Mini',
- ],
- [
- 'value' => 'gpt-4.1-nano',
- 'label' => 'GPT-4.1 Nano',
- ],
- [
- 'value' => 'gpt-4o',
- 'label' => 'GPT-4o',
- ],
- [
- 'value' => 'gpt-4o-mini',
- 'label' => 'GPT-4o Mini',
- ],
+ 'gpt-5.5',
+ 'gpt-5.4',
+ 'gpt-5.4-mini',
+ 'gpt-5.4-nano',
+ 'gpt-5',
+ 'gpt-5-mini',
+ 'gpt-5-nano',
+ 'gpt-4.1',
+ 'gpt-4.1-mini',
+ 'gpt-4.1-nano',
+ 'gpt-4o',
+ 'gpt-4o-mini',
];
}
}
--- a/slim-seo/src/MetaTags/AiProviders/OpenRouter.php
+++ b/slim-seo/src/MetaTags/AiProviders/OpenRouter.php
@@ -9,92 +9,33 @@
return 'https://openrouter.ai/api/v1/responses';
}
+ /**
+ * @link https://openrouter.ai/models?input_modalities=text&categories=marketing/seo
+ */
public function get_models(): array {
return [
- [
- 'value' => 'openai/gpt-5.4',
- 'label' => 'OpenAI: GPT-5.4',
- ],
- [
- 'value' => 'openai/gpt-5.4-mini',
- 'label' => 'OpenAI: GPT-5.4 Mini',
- ],
- [
- 'value' => 'openai/gpt-5.4-nano',
- 'label' => 'OpenAI: GPT-5.4 Nano',
- ],
- [
- 'value' => 'openai/gpt-5',
- 'label' => 'OpenAI: GPT-5',
- ],
- [
- 'value' => 'openai/gpt-5-mini',
- 'label' => 'OpenAI: GPT-5 Mini',
- ],
- [
- 'value' => 'openai/gpt-5-nano',
- 'label' => 'OpenAI: GPT-5 Nano',
- ],
- [
- 'value' => 'openai/gpt-4.1',
- 'label' => 'OpenAI: GPT-4.1',
- ],
- [
- 'value' => 'openai/gpt-4.1-mini',
- 'label' => 'OpenAI: GPT-4.1 Mini',
- ],
- [
- 'value' => 'openai/gpt-4.1-nano',
- 'label' => 'OpenAI: GPT-4.1 Nano',
- ],
- [
- 'value' => 'openai/gpt-4o',
- 'label' => 'OpenAI: GPT-4o',
- ],
- [
- 'value' => 'openai/gpt-4o-mini',
- 'label' => 'OpenAI: GPT-4o Mini',
- ],
- [
- 'value' => 'anthropic/claude-opus-4-6',
- 'label' => 'Anthropic: Claude Opus 4.6',
- ],
- [
- 'value' => 'anthropic/claude-sonnet-4.6',
- 'label' => 'Anthropic: Claude Sonnet 4.6',
- ],
- [
- 'value' => 'anthropic/claude-haiku-4-5',
- 'label' => 'Anthropic: Claude Haiku 4.5',
- ],
- [
- 'value' => 'google/gemini-3.1-pro-preview',
- 'label' => 'Google: Gemini 3.1 Pro Preview',
- ],
- [
- 'value' => 'google/gemini-3.1-flash-preview',
- 'label' => 'Google: Gemini 3.1 Flash Preview',
- ],
- [
- 'value' => 'google/gemini-3.1-flash-lite-preview',
- 'label' => 'Google: Gemini 3.1 Flash Lite Preview',
- ],
- [
- 'value' => 'google/gemini-2.5-pro',
- 'label' => 'Google: Gemini 2.5 Pro',
- ],
- [
- 'value' => 'google/gemini-2.5-flash',
- 'label' => 'Google: Gemini 2.5 Flash',
- ],
- [
- 'value' => 'google/gemini-2.5-flash-lite',
- 'label' => 'Google: Gemini 2.5 Flash Lite',
- ],
- [
- 'value' => 'deepseek/deepseek-v3.2',
- 'label' => 'DeepSeek: DeepSeek V3.2',
- ],
+ 'openai/gpt-5.5',
+ 'openai/gpt-5.4',
+ 'openai/gpt-5.4-mini',
+ 'openai/gpt-5.4-nano',
+ 'openai/gpt-5',
+ 'openai/gpt-5-mini',
+ 'openai/gpt-5-nano',
+ 'openai/gpt-4.1',
+ 'openai/gpt-4.1-mini',
+ 'openai/gpt-4.1-nano',
+ 'openai/gpt-4o',
+ 'openai/gpt-4o-mini',
+ 'anthropic/claude-opus-4-6',
+ 'anthropic/claude-sonnet-4.6',
+ 'anthropic/claude-haiku-4-5',
+ 'google/gemini-3.1-pro-preview',
+ 'google/gemini-3.1-flash-preview',
+ 'google/gemini-3.1-flash-lite-preview',
+ 'google/gemini-2.5-pro',
+ 'google/gemini-2.5-flash',
+ 'google/gemini-2.5-flash-lite',
+ 'deepseek/deepseek-v3.2',
];
}
}
--- a/slim-seo/src/MetaTags/BulkAI.php
+++ b/slim-seo/src/MetaTags/BulkAI.php
@@ -25,6 +25,7 @@
public function register_routes(): void {
register_rest_route( self::REST_NS, 'bulk-ai/chunk', [
+ 'show_in_index' => false,
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'process_chunk' ],
'permission_callback' => fn () => current_user_can( 'manage_options' ),
--- a/slim-seo/src/MetaTags/Data.php
+++ b/slim-seo/src/MetaTags/Data.php
@@ -51,7 +51,7 @@
];
}
- private function get_user_data() {
+ private function get_user_data(): array {
return $this->get_user( get_current_user_id() );
}
@@ -65,7 +65,7 @@
return empty( $post ) ? [] : $this->get_user( $post->post_author );
}
- private function get_user( $user_id ) {
+ private function get_user( $user_id ): array {
$user = get_userdata( $user_id );
if ( ! $user ) {
return [];
--- a/slim-seo/src/MetaTags/Description.php
+++ b/slim-seo/src/MetaTags/Description.php
@@ -73,7 +73,7 @@
$post_type = get_post_type( $post_id );
- // Use post type settings if avaiable, then fallback to the post auto description
+ // Use post type settings if available, then fallback to the post auto description
return Option::get( "$post_type.description", self::DEFAULTS['post'] );
}
@@ -106,7 +106,7 @@
return '';
}
- // Use taxonomy settings if avaiable, then fallback to the term auto description
+ // Use taxonomy settings if available, then fallback to the term auto description
return Option::get( "{$term->taxonomy}.description", self::DEFAULTS['term'] );
}
@@ -124,7 +124,7 @@
}
private function get_author_value(): string {
- // Use author settings if avaiable, then fallback to the author auto description
+ // Use author settings if available, then fallback to the author auto description
return Option::get( 'author.description', self::DEFAULTS['author'] );
}
--- a/slim-seo/src/MetaTags/Helper.php
+++ b/slim-seo/src/MetaTags/Helper.php
@@ -75,6 +75,7 @@
'gravityview',
'civicrm',
'contact-form-7',
+ 'fluent_cart_customer_profile',
// Filter everything.
'fe_widget',
--- a/slim-seo/src/MetaTags/Image.php
+++ b/slim-seo/src/MetaTags/Image.php
@@ -4,6 +4,7 @@
defined( 'ABSPATH' ) || die;
use WP_Term;
+use WP_Post;
use SlimSEOHelpersImages;
use SlimSEOHelpersOption;
@@ -37,22 +38,15 @@
// Get from settings.
$option = get_option( 'slim_seo', [] );
$post = $this->get_queried_object();
- if ( empty( $post ) ) {
+ if ( ! ( $post instanceof WP_Post ) ) {
return [];
}
if ( isset( $option[ $post->post_type ][ $this->meta_key ] ) ) {
return $this->get_from_settings( $option[ $post->post_type ][ $this->meta_key ] );
}
- // Get from thumbnail or content.
- $images = Images::get_post_images( $this->get_queried_object() );
- if ( empty( $images ) ) {
- return [];
- }
-
- $first_image = reset( $images );
- $method = is_numeric( $first_image ) ? 'get_data' : 'get_data_from_url';
- return $this->$method( $first_image );
+ // Get from thumbnail.
+ return has_post_thumbnail() ? $this->get_data( get_post_thumbnail_id() ) : [];
}
private function get_term_value(): array {
--- a/slim-seo/src/MetaTags/OpenGraph.php
+++ b/slim-seo/src/MetaTags/OpenGraph.php
@@ -76,8 +76,11 @@
return $this->get_image_attribute( 'alt' );
}
- private function get_image_attribute( $key ) {
- $image = $this->image_obj->get_value() ?: $this->get_default_image();
+ private function get_image_attribute( string $key ) {
+ static $image = null;
+ if ( $image === null ) {
+ $image = $this->image_obj->get_value() ?: $this->get_default_image();
+ }
return $image[ $key ] ?? null;
}
--- a/slim-seo/src/MetaTags/Settings/Preview.php
+++ b/slim-seo/src/MetaTags/Settings/Preview.php
@@ -22,24 +22,28 @@
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'render_post_title' ],
'permission_callback' => [ $this, 'can_edit_post' ],
+ 'show_in_index' => false,
] );
register_rest_route( 'slim-seo', self::ROUTE_PREFIX . 'term-title', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'render_term_title' ],
'permission_callback' => [ $this, 'can_edit_term' ],
+ 'show_in_index' => false,
] );
register_rest_route( 'slim-seo', self::ROUTE_PREFIX . 'post-description', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'render_post_description' ],
'permission_callback' => [ $this, 'can_edit_post' ],
+ 'show_in_index' => false,
] );
register_rest_route( 'slim-seo', self::ROUTE_PREFIX . 'term-description', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'render_term_description' ],
'permission_callback' => [ $this, 'can_edit_term' ],
+ 'show_in_index' => false,
] );
// Render text for homepage title and description.
@@ -47,6 +51,7 @@
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'render_homepage_text' ],
'permission_callback' => [ $this, 'can_edit_homepage' ],
+ 'show_in_index' => false,
] );
}
--- a/slim-seo/src/Notification.php
+++ b/slim-seo/src/Notification.php
@@ -88,7 +88,7 @@
}
private function get_ssl_message() {
- if ( ! is_ssl() && ! 'local' === wp_get_environment_type() ) {
+ if ( ! is_ssl() && 'local' !== wp_get_environment_type() ) {
$this->messages[] = sprintf( __( 'Your website does not use HTTPS. Please upgrade your host to fix this.', 'slim-seo' ), admin_url( 'options-reading.php' ) );
}
}
--- a/slim-seo/src/Redirection/Api/Log404.php
+++ b/slim-seo/src/Redirection/Api/Log404.php
@@ -19,29 +19,23 @@
return;
}
- register_rest_route( 'slim-seo-redirection', 'records/total', [
+ $args = [
'methods' => WP_REST_Server::READABLE,
- 'callback' => [ $this, 'total' ],
'permission_callback' => [ $this, 'has_permission' ],
- ] );
-
- register_rest_route( 'slim-seo-redirection', 'records/list', [
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => [ $this, 'list' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
-
- register_rest_route( 'slim-seo-redirection', 'records/delete', [
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => [ $this, 'delete' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
-
- register_rest_route( 'slim-seo-redirection', 'records/delete-all', [
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => [ $this, 'delete_all' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
+ 'show_in_index' => false,
+ ];
+ register_rest_route( 'slim-seo-redirection', 'records/total', array_merge( $args, [
+ 'callback' => [ $this, 'total' ],
+ ] ) );
+ register_rest_route( 'slim-seo-redirection', 'records/list', array_merge( $args, [
+ 'callback' => [ $this, 'list' ],
+ ] ) );
+ register_rest_route( 'slim-seo-redirection', 'records/delete', array_merge( $args, [
+ 'callback' => [ $this, 'delete' ],
+ ] ) );
+ register_rest_route( 'slim-seo-redirection', 'records/delete-all', array_merge( $args, [
+ 'callback' => [ $this, 'delete_all' ],
+ ] ) );
}
public function total(): int {
--- a/slim-seo/src/Redirection/Api/Redirects.php
+++ b/slim-seo/src/Redirection/Api/Redirects.php
@@ -15,41 +15,38 @@
}
public function register_routes() {
- register_rest_route( 'slim-seo-redirection', 'redirects', [
+ $args = [
'methods' => WP_REST_Server::READABLE,
- 'callback' => [ $this, 'get_redirects' ],
'permission_callback' => [ $this, 'has_permission' ],
- ] );
+ 'show_in_index' => false,
+ ];
- register_rest_route( 'slim-seo-redirection', 'exists', [
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => [ $this, 'exists' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
-
- register_rest_route( 'slim-seo-redirection', 'update_redirect', [
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => [ $this, 'update_redirect' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
-
- register_rest_route( 'slim-seo-redirection', 'delete_redirects', [
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => [ $this, 'delete_redirects' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
-
- register_rest_route( 'slim-seo-redirection', 'reorder_redirects', [
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => [ $this, 'reorder_redirects' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
-
- register_rest_route( 'slim-seo-redirection', 'posts', [
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => [ $this, 'get_posts' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
+ register_rest_route( 'slim-seo-redirection', 'redirects', array_merge( $args, [
+ 'callback' => [ $this, 'get_redirects' ],
+ ] ) );
+
+ register_rest_route( 'slim-seo-redirection', 'exists', array_merge( $args, [
+ 'callback' => [ $this, 'exists' ],
+ ] ) );
+
+ register_rest_route( 'slim-seo-redirection', 'update_redirect', array_merge( $args, [
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => [ $this, 'update_redirect' ],
+ ] ) );
+
+ register_rest_route( 'slim-seo-redirection', 'delete_redirects', array_merge( $args, [
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => [ $this, 'delete_redirects' ],
+ ] ) );
+
+ register_rest_route( 'slim-seo-redirection', 'reorder_redirects', array_merge( $args, [
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => [ $this, 'reorder_redirects' ],
+ ] ) );
+
+ register_rest_route( 'slim-seo-redirection', 'posts', array_merge( $args, [
+ 'callback' => [ $this, 'get_posts' ],
+ ] ) );
}
public function get_redirects(): array {
--- a/slim-seo/src/Redirection/ExportImport.php
+++ b/slim-seo/src/Redirection/ExportImport.php
@@ -19,18 +19,21 @@
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'export' ],
'permission_callback' => [ $this, 'has_permission' ],
+ 'show_in_index' => false,
] );
register_rest_route( 'slim-seo-redirection', 'import', [
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'import' ],
'permission_callback' => [ $this, 'has_permission' ],
+ 'show_in_index' => false,
] );
register_rest_route( 'slim-seo-redirection', 'sample', [
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'sample' ],
'permission_callback' => [ $this, 'has_permission' ],
+ 'show_in_index' => false,
] );
}
--- a/slim-seo/src/Settings/MetaTags/RestApi.php
+++ b/slim-seo/src/Settings/MetaTags/RestApi.php
@@ -10,29 +10,26 @@
}
public function register_routes(): void {
- register_rest_route( 'slim-seo', 'meta-tags/option', [
+ $args = [
'methods' => WP_REST_Server::EDITABLE,
- 'callback' => [ $this, 'get_option' ],
'permission_callback' => [ $this, 'has_permission' ],
- ] );
+ 'show_in_index' => false,
+ ];
+ register_rest_route( 'slim-seo', 'meta-tags/option', array_merge( $args, [
+ 'callback' => [ $this, 'get_option' ],
+ ] ) );
- register_rest_route( 'slim-seo', 'meta-tags/variables', [
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => [ $this, 'get_variables' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
+ register_rest_route( 'slim-seo', 'meta-tags/variables', array_merge( $args, [
+ 'callback' => [ $this, 'get_variables' ],
+ ] ) );
- register_rest_route( 'slim-seo', 'meta-tags/image_variables', [
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => [ $this, 'get_image_variables' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
+ register_rest_route( 'slim-seo', 'meta-tags/image_variables', array_merge( $args, [
+ 'callback' => [ $this, 'get_image_variables' ],
+ ] ) );
- register_rest_route( 'slim-seo', 'meta-tags/meta_keys', [
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => [ $this, 'get_meta_keys' ],
- 'permission_callback' => [ $this, 'has_permission' ],
- ] );
+ register_rest_route( 'slim-seo', 'meta-tags/meta_keys', array_merge( $args, [
+ 'callback' => [ $this, 'get_meta_keys' ],
+ ] ) );
}
public function has_permission(): bool {
--- a/slim-seo/src/Settings/Settings.php
+++ b/slim-seo/src/Settings/Settings.php
@@ -76,9 +76,6 @@
wp_enqueue_script( 'slim-seo-settings-ai', SLIM_SEO_URL . 'js/settings-ai.js', [ 'wp-api-fetch' ], filemtime( SLIM_SEO_DIR . '/js/settings-ai.js' ), true );
wp_localize_script( 'slim-seo-settings-ai', 'ssAiSettings', [
'model' => Option::get( 'ai_model' ),
- 'text' => [
- 'noModelsAvailable' => __( 'No models available', 'slim-seo' ),
- ],
'bulk' => [
'running' => __( 'Generating...', 'slim-seo' ),
'restFail' => __( 'Something went wrong. Please try again or check your server error log.', 'slim-seo' ),
--- a/slim-seo/src/Settings/tabs/social.php
+++ b/slim-seo/src/Settings/tabs/social.php
@@ -1,7 +1,7 @@
<?php defined( 'ABSPATH' ) || die ?>
<?php if ( $this->is_feature_active( 'open_graph' ) || $this->is_feature_active( 'twitter_cards' ) ) : ?>
- <h3><?php esc_attr_e( 'Default Social Images', 'slim-seo' ); ?></h3>
+ <h3><?php esc_html_e( 'Default Social Images', 'slim-seo' ); ?></h3>
<p><?php esc_html_e( 'These images are used when the post/page being shared does not have featured image or social images set up.', 'slim-seo' ); ?></p>
<?php if ( $this->is_feature_active( 'open_graph' ) ) : ?>
@@ -43,7 +43,7 @@
<?php endif; ?>
<?php endif; ?>
-<h3><?php esc_attr_e( 'Social Media Analytics', 'slim-seo' ); ?></h3>
+<h3><?php esc_html_e( 'Social Media Analytics', 'slim-seo' ); ?></h3>
<p><?php esc_html_e( 'If you are using Facebook or X analytic tools, enter the details below. Omitting them has no effect on how a shared web page appears on a Facebook timeline or X feed.', 'slim-seo' ); ?></p>
<div class="ef-control">
--- a/slim-seo/src/Settings/tabs/tools.php
+++ b/slim-seo/src/Settings/tabs/tools.php
@@ -21,9 +21,8 @@
<option value="anthropic" <?php selected( $data['ai_provider'] ?? '', 'anthropic' ); ?>><?php esc_html_e( 'Anthropic (Claude)', 'slim-seo' ); ?></option>
<option value="openrouter" <?php selected( $data['ai_provider'] ?? '', 'openrouter' ); ?>><?php esc_html_e( 'OpenRouter', 'slim-seo' ); ?></option>
</select>
- <select name="slim_seo[ai_model]" id="ss-ai-model">
- <option value=""><?php esc_html_e( 'Select a provider first', 'slim-seo' ); ?></option>
- </select>
+ <input type="text" name="slim_seo[ai_model]" id="ss-ai-model" list="ss-ai-model-list" value="<?php echo esc_attr( $data['ai_model'] ?? '' ); ?>" placeholder="<?php esc_attr_e( 'Select or enter a model name', 'slim-seo' ); ?>" autocomplete="off" />
+ <datalist id="ss-ai-model-list"></datalist>
</div>
</div>
<div class="ef-control">
--- a/slim-seo/src/Sitemaps/PostType.php
+++ b/slim-seo/src/Sitemaps/PostType.php
@@ -27,7 +27,7 @@
'update_post_term_cache' => false,
'order' => 'DESC',
- 'orderyby' => 'date',
+ 'orderby' => 'date',
// Set 1000 to compatible with News sitemap structure.
'posts_per_page' => 1000, // @codingStandardsIgnoreLine.
--- a/slim-seo/vendor/composer/installed.php
+++ b/slim-seo/vendor/composer/installed.php
@@ -1,9 +1,9 @@
<?php return array(
'root' => array(
'name' => 'elightup/slim-seo',
- 'pretty_version' => '4.9.8',
- 'version' => '4.9.8.0',
- 'reference' => '37759ee0a41804989a5f82b5878750087dbd5cab',
+ 'pretty_version' => '4.9.9',
+ 'version' => '4.9.9.0',
+ 'reference' => '589f32beb9829564a6cc2565351d42de9beda73f',
'type' => 'wordpress-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -11,9 +11,9 @@
),
'versions' => array(
'elightup/slim-seo' => array(
- 'pretty_version' => '4.9.8',
- 'version' => '4.9.8.0',
- 'reference' => '37759ee0a41804989a5f82b5878750087dbd5cab',
+ 'pretty_version' => '4.9.9',
+ 'version' => '4.9.9.0',
+ 'reference' => '589f32beb9829564a6cc2565351d42de9beda73f',
'type' => 'wordpress-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),