我正在创建一个内部插件,该插件将根据配置为任何帖子类型提供使用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。
我不想使用全局变量。。。对您认为的绕过此问题的优雅方法感兴趣。
感谢您抽出时间阅读此文!
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\'] );
没有瞬变,没有限制,它只是工作!:-)