wpslug/wpslug.php
wenpai 08b70318f9
Some checks failed
Release Plugin / release (push) Has been cancelled
gitleaks 密钥泄露扫描 / gitleaks (pull_request) Successful in -52s
安全扫描 / security-scan (pull_request) Successful in -52s
WordPress 插件 CI / ci (pull_request) Failing after 11m7s
fix: 更新器改用唯一类名 WPSlug_Updater;发版 1.2.1
22 个文派插件各自捆绑一份 includes/class-wenpai-updater.php,都声明同一个
全局类 WenPai_Updater。文件顶部的 class_exists() + return 守卫并不是安全的
条件声明写法,在特定 opcache 缓存态下会被绕过,导致:

  Fatal error: Cannot declare class WenPai_Updater, because the name is
  already in use in .../includes/class-wenpai-updater.php on line 27

已在客户站实测复现(文派云桥 + WPCY Template Connector 同装,wp-admin 全 500)。
本插件 1.2.0 与云桥 1.2.2 同装存在同样风险。

改为 WPSlug_Updater 后不再占用共享类名。附带修掉一个静默问题:改之前全站
只可能存在一个 WenPai_Updater 实例(先加载者赢),各插件会用到别的插件
捆绑的更新器版本;现在各用自己的。

同时把版本推进到 1.2.1 发布此修复。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-27 15:55:42 +08:00

233 lines
6.6 KiB
PHP

<?php
/*
Plugin Name: WPSlug
Plugin URI: https://wpcy.com/slug
Description: Advanced slug management plugin with Chinese Pinyin support and SEO optimization.
Version: 1.2.1
Author: WPSlug
Author URI: https://wpcy.com/slug
License: GPL2
Text Domain: wpslug
Domain Path: /languages
Update URI: https://updates.wenpai.net
Requires at least: 6.0
Requires PHP: 7.4
*/
if (!defined("ABSPATH")) {
exit();
}
define("WPSLUG_VERSION", "1.2.1");
define("WPSLUG_PLUGIN_DIR", plugin_dir_path(__FILE__));
define("WPSLUG_PLUGIN_URL", plugin_dir_url(__FILE__));
define("WPSLUG_PLUGIN_BASENAME", plugin_basename(__FILE__));
class WPSlug
{
private static $instance = null;
private $core = null;
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct()
{
add_action("plugins_loaded", [$this, "loadPlugin"]);
register_activation_hook(__FILE__, [$this, "activate"]);
register_deactivation_hook(__FILE__, [$this, "deactivate"]);
register_uninstall_hook(__FILE__, ["WPSlug", "uninstall"]);
add_action('init', [$this, 'initLanguages']);
}
public function loadPlugin()
{
if (!$this->checkRequirements()) {
return;
}
$this->loadDependencies();
$this->loadTextdomain();
$this->core = new WPSlug_Core();
new WPSlug_Updater( WPSLUG_PLUGIN_BASENAME, WPSLUG_VERSION );
}
private function checkRequirements()
{
if (version_compare(PHP_VERSION, "7.0", "<")) {
add_action('admin_notices', function() {
echo '<div class="notice notice-error"><p>';
echo esc_html__('WP Slug requires PHP 7.0 or higher. Please upgrade your PHP version.', 'wpslug');
echo '</p></div>';
});
return false;
}
if (version_compare(get_bloginfo("version"), "5.0", "<")) {
add_action('admin_notices', function() {
echo '<div class="notice notice-error"><p>';
echo esc_html__('WP Slug requires WordPress 5.0 or higher. Please upgrade your WordPress version.', 'wpslug');
echo '</p></div>';
});
return false;
}
return true;
}
private function loadDependencies()
{
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-validator.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-settings.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-pinyin.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-optimizer.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-transliterator.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-translator.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-converter.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-core.php";
require_once WPSLUG_PLUGIN_DIR . "includes/class-wenpai-updater.php";
if (is_admin()) {
require_once WPSLUG_PLUGIN_DIR . "includes/class-wpslug-admin.php";
}
}
public function initLanguages()
{
$locale = apply_filters('plugin_locale', get_locale(), 'wpslug');
$mo_file = WPSLUG_PLUGIN_DIR . "languages/wpslug-{$locale}.mo";
if (file_exists($mo_file)) {
load_textdomain('wpslug', $mo_file);
}
}
public function loadTextdomain()
{
load_plugin_textdomain(
"wpslug",
false,
dirname(plugin_basename(__FILE__)) . "/languages/"
);
}
public function activate()
{
if (!function_exists("is_plugin_active")) {
require_once ABSPATH . "wp-admin/includes/plugin.php";
}
if (!$this->checkRequirements()) {
deactivate_plugins(plugin_basename(__FILE__));
wp_die(
esc_html__('WP Slug plugin requirements not met. Please check your PHP and WordPress versions.', 'wpslug'),
esc_html__('Plugin Activation Error', 'wpslug'),
array('back_link' => true)
);
}
$this->loadDependencies();
try {
$settings = new WPSlug_Settings();
$settings->createDefaultOptions();
$core = new WPSlug_Core();
$core->activate();
add_option('wpslug_activation_redirect', true);
} catch (Exception $e) {
error_log('WP Slug activation error: ' . $e->getMessage());
wp_die(
esc_html__('An error occurred during plugin activation. Please check your server logs.', 'wpslug'),
esc_html__('Plugin Activation Error', 'wpslug'),
array('back_link' => true)
);
}
}
public function deactivate()
{
try {
if ($this->core) {
$this->core->deactivate();
}
delete_option('wpslug_activation_redirect');
} catch (Exception $e) {
error_log('WP Slug deactivation error: ' . $e->getMessage());
}
}
public static function uninstall()
{
try {
if (class_exists("WPSlug_Settings")) {
$settings = new WPSlug_Settings();
$settings->uninstall();
}
delete_option('wpslug_activation_redirect');
} catch (Exception $e) {
error_log('WP Slug uninstall error: ' . $e->getMessage());
}
}
public function getCore()
{
return $this->core;
}
public function getSettings()
{
if ($this->core) {
return $this->core->getSettings();
}
return null;
}
public function getConverter()
{
if ($this->core) {
return $this->core->getConverter();
}
return null;
}
public function getOptimizer()
{
if ($this->core) {
return $this->core->getOptimizer();
}
return null;
}
}
function wpslug()
{
return WPSlug::getInstance();
}
if (is_admin()) {
add_action('admin_init', function() {
if (get_option('wpslug_activation_redirect', false)) {
delete_option('wpslug_activation_redirect');
if (!isset($_GET['activate-multi'])) {
wp_safe_redirect(admin_url('options-general.php?page=wpslug'));
exit;
}
}
});
}
wpslug();