首页 > 解决方案 > 为什么我的 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 版以来,以下内容发生了变化:

  1. 尝试在名为 constants.php 的包含 PHP 文件(上面给出的代码)中的 PHP 会话变量中设置对话框小部件的 css 类和 css id
  2. 将这些类和 id 传递给 javascript 和 css 文件
  3. 使用 PHP 会话中的 wp_localize_script 函数将类和 id 传递给 javascript。
  4. 将 css 样式表创建为 PHP 文件,并将 Content-Type 标头作为 text/css MIME 类型并在前端调用它们。(上面给出的代码)
  5. 从 PHP 会话中调用 css 类和 id,并在上面第 4 点的 CSS 文件中为它们设置样式
  6. 在名为“eazy_ad_unblocker_aspect_ratio”的函数中封装一些连续的javascript代码,并调用该函数来代替连续代码。(在名为 custom.js 的文件中)
  7. 在插件版本 1.1.7 中调用了 constants.php 中的 session_write_close()。

谢谢和问候, Pratyush

标签: javascriptphpcsswordpressplugins

解决方案


推荐阅读