javascript - 为什么我的 WordPress 插件会让网站进入不可阻挡的刷新状态?
问题描述
我是一名新手 PHP 程序员,我尝试在空闲时间制作 Wordpress 插件。
在开发和增强我的插件的过程中,我尝试添加一个功能,其中由插件创建和显示的对话框小部件的 css 类和 id 都是随机的。
在尝试执行此操作时,我将 PHP 会话中的那些随机类和 id 设置在包含在主插件 index.php 文件中的 PHP 文件中,并将这些类和 id 传递给 JavaScript 和 CSS 文件。
请注意,在包含的 PHP 文件中完成会话中所需的变量设置后,我调用了 session_write_close()。
<?php
@session_start();
if(!isset($_SESSION["eazy_ad_rand_words"]))
{
$eazy_ad_words_path = plugins_url('file/words.txt', dirname(__FILE__));
$eazy_ad_fileWords = @file_get_contents($eazy_ad_words_path, FILE_USE_INCLUDE_PATH);
if($eazy_ad_fileWords === false) //if file not read for some reason
{
$eazy_ad_wordsArray = array("word1","word2","word3","word4","word5","word6","word7","word8");
$_SESSION["eazy_ad_rand_words"] = $eazy_ad_wordsArray;
}
else{
$eazy_ad_wordsArray = explode("\n", $eazy_ad_fileWords);
$eazy_ad_randWordsKeys = array_rand($eazy_ad_wordsArray, 8);
$eazy_ad_randWordElems = array();
foreach($eazy_ad_randWordsKeys as $key)
{
$eazy_ad_randWordElems[] = $eazy_ad_wordsArray[$key];
}
$_SESSION["eazy_ad_rand_words"] = $eazy_ad_randWordElems;
}
}
$prefix_array = array("a","b","e", "u");
shuffle($prefix_array);
$eazy_ad_unblocker_str1 = implode("", $prefix_array)."_";
$eazy_ad_unblocker_holder_id = '';
if(isset($_SESSION["eazy_ad_rand_words"]))
{
$eazy_ad_unblocker_holder_id = $_SESSION["eazy_ad_rand_words"][0].'-'.md5(microtime());
}
else
{
$eazy_ad_unblocker_holder_id = $eazy_ad_unblocker_str1.md5(microtime());
}
if(!isset($_SESSION['EAZY_AD_UNBLOCKER_HOLDER_ID']))
{
//
$_SESSION['EAZY_AD_UNBLOCKER_HOLDER_ID'] = $eazy_ad_unblocker_holder_id;
}
shuffle($prefix_array);
$eazy_ad_unblocker_holder_class_name = '';
$eazy_ad_unblocker_str2 = implode("", $prefix_array)."_";
if(isset($_SESSION["eazy_ad_rand_words"]))
{
$eazy_ad_unblocker_holder_class_name = $_SESSION["eazy_ad_rand_words"][1].'-'.md5(microtime());
}
else
{
$eazy_ad_unblocker_holder_class_name = $eazy_ad_unblocker_str2.md5(microtime());
}
if(!isset($_SESSION['EAZY_AD_UNBLOCKER_HOLDER_CLASS_NAME']))
{
$_SESSION['EAZY_AD_UNBLOCKER_HOLDER_CLASS_NAME'] = $eazy_ad_unblocker_holder_class_name;
}
shuffle($prefix_array);
$eazy_ad_unblocker_dialog_overlay_id = '';
$eazy_ad_unblocker_str3 = implode("", $prefix_array)."_";
if(isset($_SESSION["eazy_ad_rand_words"]))
{
$eazy_ad_unblocker_dialog_overlay_id = $_SESSION["eazy_ad_rand_words"][2].'-'.md5(microtime());
}
else{
$eazy_ad_unblocker_dialog_overlay_id = $eazy_ad_unblocker_str3.md5(microtime());
}
if(!isset($_SESSION['EAZY_AD_UNBLOCKER_DIALOG_OVERLAY_ID']))
{
//
$_SESSION['EAZY_AD_UNBLOCKER_DIALOG_OVERLAY_ID'] = $eazy_ad_unblocker_dialog_overlay_id;
}
shuffle($prefix_array);
$eazy_ad_unblocker_dialog_parent_id = '';
$eazy_ad_unblocker_str4 = implode("", $prefix_array)."_";
if(isset($_SESSION["eazy_ad_rand_words"]))
{
$eazy_ad_unblocker_dialog_parent_id = $_SESSION["eazy_ad_rand_words"][3].'-'.md5(microtime());
}
else
{
$eazy_ad_unblocker_dialog_parent_id = $eazy_ad_unblocker_str4.md5(microtime());
}
if(!isset($_SESSION['EAZY_AD_UNBLOCKER_DIALOG_PARENT_ID']))
{
$_SESSION['EAZY_AD_UNBLOCKER_DIALOG_PARENT_ID'] = $eazy_ad_unblocker_dialog_parent_id;
}
shuffle($prefix_array);
$eazy_ad_unblocker_dialog_message_id = '';
$eazy_ad_unblocker_str5 = implode("", $prefix_array)."_";
if(isset($_SESSION["eazy_ad_rand_words"]))
{
$eazy_ad_unblocker_dialog_message_id = $_SESSION["eazy_ad_rand_words"][4].'-'.md5(microtime());
}
else{
$eazy_ad_unblocker_dialog_message_id = $eazy_ad_unblocker_str5.md5(microtime());
}
if(!isset($_SESSION['EAZY_AD_UNBLOCKER_DIALOG_MESSAGE_ID']))
{
$_SESSION['EAZY_AD_UNBLOCKER_DIALOG_MESSAGE_ID'] = $eazy_ad_unblocker_dialog_message_id;
}
shuffle($prefix_array);
$eazy_ad_unblocker_refresh_btn_class = '';
$eazy_ad_unblocker_str6 = implode("", $prefix_array)."_";
if(isset($_SESSION["eazy_ad_rand_words"]))
{
$eazy_ad_unblocker_refresh_btn_class = $_SESSION["eazy_ad_rand_words"][5].'-'.md5(microtime());
}
else{
$eazy_ad_unblocker_refresh_btn_class = $eazy_ad_unblocker_str6.md5(microtime());
}
if(!isset($_SESSION['EAZY_AD_UNBLOCKER_REFRESH_BTN_CLASS']))
{
$_SESSION['EAZY_AD_UNBLOCKER_REFRESH_BTN_CLASS'] = $eazy_ad_unblocker_refresh_btn_class;
}
//April 10 2021
session_write_close();
//End April 10 2021
$eazy_ad_unblocker_popup_params_array = array("eazy_ad_unblocker_holder"=> $_SESSION['EAZY_AD_UNBLOCKER_HOLDER_ID'],
"eazy_ad_unblocker_holder_class_name" => $_SESSION['EAZY_AD_UNBLOCKER_HOLDER_CLASS_NAME'],
"eazy_ad_unblocker_dialog_overlay"=> $_SESSION['EAZY_AD_UNBLOCKER_DIALOG_OVERLAY_ID'],
"eazy_ad_unblocker_dialog_parent" => $_SESSION['EAZY_AD_UNBLOCKER_DIALOG_PARENT_ID'],
"eazy_ad_unblocker_dialog_message" => $_SESSION['EAZY_AD_UNBLOCKER_DIALOG_MESSAGE_ID'],
"eazy_ad_unblocker_refresh_btn_class" => $_SESSION['EAZY_AD_UNBLOCKER_REFRESH_BTN_CLASS']);
对于 JavaScript,我只使用了 wp_localize_script() 函数,它就可以工作。
对于 CSS,我创建了一个名为 style.css.php 的 PHP 文件,并在文件顶部调用 PHP 标头函数,将 Content-Type 作为 text/css 传递。然后我在 style.css.php 顶部调用 session_start() 之后调用会话变量,然后为从会话中检索到的那些类和 id 设置样式。我没有使用 cookie,因为我相信精明的用户可以从 Web 开发人员工具中删除它们。
在这个 style.css.php 中,我通过以下方式调用了标头函数和会话:
<?php
@session_start();
header("Content-Type: text/css;charset=utf-8");
?>
<?php echo '#'.$_SESSION['EAZY_AD_UNBLOCKER_DIALOG_PARENT_ID']; ?> .ui-dialog-titlebar .ui-dialog-titlebar-close{ display: none !important;}
以与 style.css.php 文件相同的方式为主题创建了其他样式表。这些文件以与 style.css.php 相同的方式包含 header 和 session_start 函数
这些扩展名为 .css.php 的文件的 URL 在前端弹出窗口中称为样式表 URL。
问题是插件的一些用户报告说,在使用 PHP 7.4 和 WordPress 5.7.1 的 Litespeed 服务器中,
与我的插件一起运行 cloudflare CDN 插件时,我的插件会导致网页进入刷新或重定向循环。
https://wordpress.org/support/topic/new-updates-1-1-6-has-a-bug-continuously-refresh-webpages/
该插件在https://myplugins.net/demo/上运行良好
只需在浏览器中启用广告拦截器即可访问此网站。(支持 Microsoft Edge、FireFox、Google Chrome 和 Opera 浏览器)
我不明白问题是什么。我是否以错误的方式调用 session_start 和 header 函数?还是因为使用了 Litespeed 缓存或 Cloudflare CDN,是其他问题?
自 1.1.5 版以来,以下内容发生了变化:
- 尝试在名为 constants.php 的包含 PHP 文件(上面给出的代码)中的 PHP 会话变量中设置对话框小部件的 css 类和 css id
- 将这些类和 id 传递给 javascript 和 css 文件
- 使用 PHP 会话中的 wp_localize_script 函数将类和 id 传递给 javascript。
- 将 css 样式表创建为 PHP 文件,并将 Content-Type 标头作为 text/css MIME 类型并在前端调用它们。(上面给出的代码)
- 从 PHP 会话中调用 css 类和 id,并在上面第 4 点的 CSS 文件中为它们设置样式
- 在名为“eazy_ad_unblocker_aspect_ratio”的函数中封装一些连续的javascript代码,并调用该函数来代替连续代码。(在名为 custom.js 的文件中)
- 在插件版本 1.1.7 中调用了 constants.php 中的 session_write_close()。
谢谢和问候, Pratyush
解决方案
推荐阅读
- python - Katalon 导出 - 机器人框架问题
- r - 满足条件后开始读取文本文件
- python - 即使 KeepAlive 运行,Google IoT 设备也会进入空闲模式
- elasticsearch - 使用 Curator 重新索引所有 ElasticSearch?
- javascript - Redux 表单奇怪行为的 TextArea 字段组件?
- android - 无法使用 API 28 解析符号“TabLayout”
- javascript - 命令处理程序中的 Discord.js 音乐机器人
- html - 如何在 Bulma 模态页脚中的同一水平位置具有左对齐和右对齐的内容?
- c# - 28,000 行在生产环境中返回非常缓慢
- c# - 替代多个 using 块