在生命周期早期修改原始$_POST数据

时间:2020-03-27 作者:jamesgarrett

在使用超全局变量之前,是否有特定于插件的方法可以直接修改它们?假设以下代码位于一个名为aaa的插件中,可以想象这将在请求生命周期的早期运行。代码运行时,当其他插件使用数据时,它没有被更改。

//文件位置:wp内容/插件/aaa/aaa。php

function interfere_with_things(){

    // skip anything not applicable
    if($_SERVER[\'REQUEST_METHOD\'] !== \'POST\' || empty($_POST[\'something\'])){return;}

    // change something in the $_POST
    $_POST[\'something\'] = str_replace(\'cats\', \'dogs\', $_POST[\'something\']);

}

add_action(\'init\', \'interfere_with_things\', 1);

1 个回复
SO网友:Adam

是的,在WordPress请求生命周期中有一些点为您提供了钩子,可以修改请求和其他可用参数,稍后将介绍更多内容。

考虑因素

如您所知,您可以修改超全局变量,但这样做可能会在应用程序中引入意外行为,尤其是当您在应用程序的一个区域中对键值对执行清理/验证,但随后在应用程序的另一个区域中使用不同的超全局变量访问键值对时,无论是在您的控制下,还是在其他插件(或主题)的控制下。

例如,您可以执行以下操作:

// assume value of: $_POST[\'something\'] → cats
$_POST[\'something\'] = str_replace(\'cats\', \'dogs\', $_POST[\'something\']);
而其他人做到了:

// value is now: $_POST[\'something\'] → dogs
echo $_REQUEST[\'something\']; // → cats
如果其他人(或您)无意中使用$_REQUEST 而不是$_POST, 如果你没有改变两个超全局,你可以期待不同的结果。

建议我建议您通过确定以下内容来改变修改数据的方法:

您的实际用例是什么?谁需要使用数据(您只需要和或其他插件/主题)

  • 确定一个逻辑入口点,以便其他人可以访问该数据这里有一个(人为的)示例:

    function someone_else_interfere_with_things( $data ) {
        return \'megaladons\';
    }
    
    add_filter( \'interfere_with_things\', \'someone_else_interfere_with_things\', 10 );
    
    function interfere_with_things() {
        // ... do sanity checks here
    
        $data = isset( $_POST[\'something\'] ) ? $_POST[\'something\'] : \'default\';
        $data = apply_filters( \'interfere_with_things\', str_replace( \'cats\', \'dogs\', $data ) );
    
        echo $data; // megaladons!!!
    }
    
    add_action( \'init\', \'interfere_with_things\', 1 );
    
    
    其他插件/主题或您自己代码中的其他地方,则依赖自定义过滤器interfere_with_things 这里有一个共同的理解,即此时其他代码可以期望在一致的准备状态下修改值。

    如果其他人离开并从超球体中取出东西,那就在他们身上了。


    替代钩子init

    如果您仍然在请求生命周期的早期修改全局变量,那么您可能需要考虑其他挂钩,例如:

    • plugins_loaded
    • after_setup_theme
    • request
    • parse_requestinit.

  • 相关推荐

    使用新的WP-Query()从循环中过滤后期格式;

    嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post