插件架构问题:如何避免使用瞬变

时间:2020-04-04 作者:csaborio

我正在创建一个内部插件,该插件将根据配置为任何帖子类型提供使用AJAX的过滤机制,我已将其存储在JSON中。

加载插件时,我需要为AJAX调用设置回调,我会立即进行设置(我坚持使用OOP):

$gfb = FilterBuilder::get_instance();
$action_filter_reg_instance = new ActionFilterRegistration();
$action_filter_reg_instance->add_action( \'wp_ajax_process_filters\', $gfb, \'process_filters_callback\' );
这设置了回调,它工作正常。。。但是当显示帖子的页面加载时,$gbf的实例就会丢失,我需要在加载模板时设置更多属性。

例如,当显示帖子的页面加载时,我创建了一个新的FilterBuilder对象,并将查询参数传递给它,然后将其作为类的属性存储在实例上。

调用回调时,它处理自己的FilterBuilder实例,因此我在模板中定义的任何内容都不存在于此类实例中。

这让我有点为难,因为我想访问在创建特定实例时定义的查询参数。

我暂时求助于使用瞬态,以便有一个公共位置来访问模板实例从回调函数中定义的查询参数,但这感觉不对。此外,我认为瞬变有一个最大长度,因此如果达到该极限,这可能会爆炸。

还有什么其他选择?也许可以将模板类实例序列化为JSON并从回调加载它?这听起来也。。。有点meh。

我不想使用全局变量。。。对您认为的绕过此问题的优雅方法感兴趣。

感谢您抽出时间阅读此文!

1 个回复
SO网友:csaborio

好吧,我就是这样做的,这不是一个可怕的黑客。

因此,我的问题是将值(在本例中是查询参数)从在查询参数存在之前创建的类的实例传递给回调函数。

瞬态方法有效,但随时可能中断。

因此,当函数查询值存在时,我只是将其指定为一个隐藏输入字段的值,该字段属于保存过滤器的表单,即:

echo( \'<input type="hidden" name="wp-query-args" value="\' . $encoded_query_args . \'">\' );
在此阶段,$encoded\\u query\\u args包含使用wp\\u json\\u encode的序列化查询。

进行AJAX调用时,它使用POST将序列化的表单数据发送到回调函数:

function requestSetup($,formId,ajaxURL) {
    $(\'#saf_submit\').on(\'click\', function(){
        var filter = $(formId);
        $.ajax({
            url:ajaxURL,
            data:filter.serialize(), // form data
...
然后回调可以接收此信息并将查询参数解码为其原始形式:

$query_args = self::decode_query_args( $_POST[\'wp-query\'] );
没有瞬变,没有限制,它只是工作!:-)

相关推荐

Loop through array of pages

我正在尝试递归地获取页面的所有子级(无限深度),我正在使用下面的函数,from this solution:function get_all_subpages($page, $args = \'\', $output = OBJECT) { if (! is_numeric($page)) $page = 0; $default_args = array( \'post_type\' => \'page\',&