插件选项、预设和过滤器:你能帮我改进我的工作流程吗?

时间:2015-06-07 作者:gordie

我正在构建一个插件,我很难处理它的选项。我已经尝试了几种方法,但我想我在这里遇到了一个结构性问题。我很想听听你对这一切的意见,因为我真的不知道如何让它变得更聪明。

我关于选项的主要功能是

获取插件的选项。如果选项表中未定义,请获取默认选项。使用get\\u presets()覆盖这些选项:预设优先于用户定义的选项。有一个钩子可以过滤选项

  • get\\u default\\u options()-插件的默认选项-获取插件的预设,这些预设为空,但外部插件可以使用过滤器挂钩添加预设。如果定义了预设,它将覆盖匹配选项并灰显后端字段,因此用户无法为其定义自定义值

    我通常会检查变量($options或$options\\u presets)是否已经定义。如果是,则不会再次填充,也不会触发挂钩。我这样做是为了让代码更快,但我不确定这个想法是否好

    class MyPlugin{
    
        var $options = null;
        var $options_presets = null;
    
    
        function get_options($keys = null){
    
            //populate only once
            if ( $this->options === null ) {
    
                $default = self::get_default_options();
    
                //1 - override default options with custom options (user defined)
                if ($custom = get_post_meta($this->post_id, \'myPluginOptions\', true)){
                    $this->options = array_replace_recursive($default, $custom);
                }
    
                //2 - override custom options with presets (presets priority is higher)
                if ( $presets = $this->get_presets() ){
                    $this->options = array_replace_recursive($this->options, $presets);
                }
    
                //allow plugins to filter the options when they are populated
                $this->options = apply_filters(\'my_plugin_get_options\',$this->options,$this);
    
            }
    
            return self::et_array_value($keys,$this->options);
    
        }
    
    
        function get_default_options($keys = null){
            $defaults = array(...); //default options are set here
            return self::get_array_value($keys,$defaults);
        }
    
        /**
         * Get Presets : 
         * Allow external plugins to define presets; which will override custom options.
         * In the plugin options form, a field will be greyed out if a preset is defined.
         */
    
        function get_presets($keys = null){
    
            //populate only once
            if ( $this->options_presets === null ) {
    
                $options = get_post_meta($this->post_id, \'myPluginOptions\', true);
    
                //allow plugins to filter the presets when they are populated
                $this->options_presets = apply_filters(\'my_plugin_get_presets\',$this->options_presets,$options,$this);
    
            }
    
            return self::get_array_value($keys,$this->options_presets);
    
        }
    
        /**
         * Get a value in a multidimensional array
         */
    
        function get_array_value($keys = null, $array){
    
            if (!$keys) return $array;
            if (is_string($keys) && isset($array[$keys])) return $array[$keys];
    
            if (!isset($array[$keys[0]])) return false;
    
            if(count($keys) > 1) {
                return xspfpl_get_array_value(array_slice($keys, 1), $array[$keys[0]]);
            }else{
                return $array[$keys[0]];
            }
    
        }
    
    }
    
    function add_presets_example($presets,$meta_options,$plugin){
    
        //get options will call get_presets and so the hook my_plugin_get_presets loop and crash the plugin.
        //I could eventually unhook - rehook it with : 
        // remove_filter(\'my_plugin_get_presets\',\'add_presets_example\',10,3);
        // add_filter(\'my_plugin_get_presets\',\'add_presets_example\',10,3);
        // , but this is extra work and not very clean.
    
        if ($website_url = $plugin->get_options(\'website_url\')) {
            ...
        }
    
        return $presets;
    
    
    }
    
    
    add_filter(\'my_plugin_get_presets\',\'add_presets_example\',10,3);
    

  • 1 个回复
    SO网友:Rarst

    你没有包括你是如何得出这个概念的,但是整个“预设”逻辑分支是非常奇怪的。

    WordPress过滤器实际上以过滤结果为中心。你的my_plugin_get_options 过滤器遵循该模型-生成结果并提供修改。

    有时这是不可取的,如果我们做所有这些处理只是为了扔掉结果呢?谬论是在结果产生之前对其进行预过滤和影响。这看起来有点像你想要做的my_plugin_get_presets. 通常情况下,这会以邪恶而脆弱的混乱告终。即使core在少数几个地方也使用了这种方法,但效果却不太令人满意。

    默认值

    您不需要在每次访问时检索和处理默认值。

    当插件激活时,如果设置为空,则将默认值另存为设置。如果默认设置发生更改,唯一需要处理的事情就是,在我的脑海中,您可能可以在保存时检查并添加缺少的默认设置。

    删除所有内容,这样就可以去掉默认值和预设值-最终只需要很少的代码(这是一件好事)。您只需检索保存的选项并对其进行筛选。每个需要使用选项执行任何操作的插件都可以很好地使用该过滤器。

    这样就不需要将字段设置为只读。在我看来,这可能是完全不同的过滤器。可能需要过滤选项,而不使其成为只读或其他方式。它们不需要耦合。

    结束

    相关推荐

    OPTIONS表-我的价值去向何在?

    我刚刚接触到wordpress和wp主题开发。我知道如何从头开始创建基本的wordpress主题,但我想知道如何进入自定义主题选项。我的自定义主题选项(自定义字段)工作正常,但问题是我听说过(不是真的读过!)这些值存储在wordpress的选项表中,并从中检索。当我通过phpmyadmin查看该表时,我找不到自定义值。一切正常,但我无法在数据库中找到它。我正在使用最新版本的Wordpress