博客 / WordPress/ 解决 LNMP 环境下 WordPress 后台主题无法显示与切换的问题

解决 LNMP 环境下 WordPress 后台主题无法显示与切换的问题

问题描述

在 LNMP 环境下安装 WordPress 3.8 或更新版本时,后台“外观” → “主题”页面可能只显示一个主题,并且无法切换或添加新主题。

问题原因

此问题通常是由于 PHP 配置中禁用了 scandir() 函数导致的。scandir() 函数用于读取目录内容,WordPress 依赖此函数来扫描主题目录并列出可用主题。当该函数被禁用时,WordPress 将无法正常检测和显示主题列表。

解决方法

需要修改 PHP 配置文件(php.ini),将 scandir() 函数从禁用函数列表中移除,然后重启 PHP 服务。

步骤 1:连接到服务器

使用 SSH 客户端(如 PuTTY、Terminal 等)连接到您的 VPS 或服务器。

步骤 2:编辑 PHP 配置文件

使用文本编辑器(如 vi 或 nano)打开 PHP 配置文件。配置文件路径可能因 LNMP 安装方式而异,常见路径如下:

vi /usr/local/php/etc/php.ini

如果您使用的是其他环境或 PHP 版本,配置文件路径可能为:

  • /etc/php.ini
  • /etc/php/7.x/fpm/php.ini (适用于 PHP 7.x)
  • /usr/local/php7/etc/php.ini

步骤 3:查找禁用函数列表

在 vi 编辑器的命令模式下,输入以下命令查找 disable_functions 配置项:

/disable_functions

按回车键后,编辑器会定位到类似以下内容的行:

disable_functions = scandir,passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

步骤 4:移除 scandir 函数

  1. 将光标移动到该行。
  2. i 键进入插入模式。
  3. 从函数列表中删除 scandir,(包括逗号)。确保删除后列表格式正确,没有多余的逗号。
  4. 修改完成后,按 Esc 键退出插入模式,返回命令模式。

步骤 5:保存并退出

在命令模式下,输入以下命令保存文件并退出 vi 编辑器:

:wq

步骤 6:重启 PHP 服务

根据您的 LNMP 环境和 PHP 运行方式,执行相应的重启命令:

  • 如果使用 PHP-FPM:
    /etc/init.d/php-fpm restart

    systemctl restart php-fpm
  • 如果使用 Apache:
    /etc/init.d/httpd restart

    systemctl restart apache2
  • 如果使用 Nginx + PHP-FPM: 通常只需重启 PHP-FPM。

步骤 7:验证结果

重启服务后,刷新 WordPress 后台的“外观” → “主题”页面。现在应该可以正常显示所有主题,并能够进行切换和添加操作。

注意事项与补充说明

  • 配置文件路径: 如果上述路径不正确,您可以使用以下命令查找 php.ini 文件位置:
    php --ini | grep 'Loaded Configuration File'
  • 安全考虑: scandir() 函数本身风险较低,但禁用函数列表通常是出于安全考虑。如果您在共享主机或对安全有严格要求的环境中,请咨询服务器管理员。
  • WordPress 版本: 此解决方案适用于 WordPress 3.8 及更高版本。对于现代 WordPress(5.x 或 6.x),问题原因和解决方法相同。
  • 替代方案: 如果您无法修改 php.ini 文件(例如在共享主机上),可以尝试在网站的 .htaccess 文件(Apache)或站点 Nginx 配置中添加以下代码来覆盖设置(如果允许):
    php_value disable_functions ""

    或者,更精确地只移除 scandir:

    php_admin_value disable_functions "passthru,exec,system,..." # 列出除scandir外的其他函数

完成以上步骤后,WordPress 后台主题管理功能应恢复正常。

发表评论

您的邮箱不会公开。必填项已用 * 标注。