WordPress register_setting sanitize_callback在初始保存时运行两次

2nbm6dog  于 5个月前  发布在  WordPress
关注(0)|答案(3)|浏览(56)

我正在尝试我的技能在一个WordPress插件。
我有一个从设置页面注册设置的函数,sanitize_callback函数只在最初的第一次保存时被调用两次。
这个字段需要加密,因为它是一个密码。所以我想到了使用sanitize_callback调用函数来完成。
可能是错误的方法!你会怎么做?

$pswd_args = array(
            "type" => "string",
            "description" => "",
            "sanitize_callback" => array( $this, "encryptPSWD"),
            "show_in_rest" => false,
            "zzz_password"
        );
register_setting( self::OPTION_GROUPE_NAME, "zzz_password", $pswd_args );

字符串
我已经搜索了一些解决方案,但到目前为止还没有。我发现这篇文章是关于什么接缝是一个错误报告,已经运行了相当长的一段时间,但不确定这是否是100%与我的问题有关。
https://core.trac.wordpress.org/ticket/21989
任何工作都会有帮助!谢谢

r1wp621o

r1wp621o1#

你可以在你的类上创建一个boolean属性,并将它设置为false,在sanitize_callback上你可以检查:如果它是false,你可以运行密码加密,如果它是true,你可以跳过加密,在返回值之前,你将属性设置为true。

class MyPlugin {
  
  protected bool $settingsRegistered = false;
  
  public function __construct() {
    add_action( 'admin_init', [ $this, 'registerSettings' ] );
  }
  
  public function registerSettings() {
    $pswd_args = array(
        "type" => "string",
        "description" => "",
        "sanitize_callback" => array( $this, "encryptPSWD"),
        "show_in_rest" => false,
        "zzz_password"
    );
    register_setting( self::OPTION_GROUPE_NAME, "zzz_password", $pswd_args );
  }

  public function encryptPSWD($settings) {
    if(!$this->settingsRegistered) {
      // Encrypt your password here
    }
    
    $this->settingsRegistered = true;
    return $settings;
  }
}

字符串

r6hnlfcb

r6hnlfcb2#

最后,我能够绕过这个问题。我做了一些测试,什么是在core.track链接接缝是什么正在发生的事情。该过程中,该选项通过是:
1.正在更新,但还不存在,请在尝试之前使用sanitize_callback
1.添加,因为第一次尝试返回false并再次应用sanitize_callback
为了绕过它
1.我删除了register_setting中的sanitize_callback
1.使用pre_update_option_{ $option_name }钩子添加了一个筛选器

$pswd_args = array(
            "type" => "string",
            "description" => "",
            "show_in_rest" => false,
            "zzz_password"
        );
register_setting( self::OPTION_GROUPE_NAME, "zzz_password", $pswd_args );

字符串
在冰箱里

add_filter( "pre_update_option_my_option", array( $this, "function_name" ), 10, 2 );


这个调用负责在添加或更新保存的选项的值之前修改值。奇怪的是,这个钩子执行与以前相同的过程,但没有在过程的各个步骤上应用回调函数。
在这个问题上的任何改进都是值得欢迎的。

cwdobuhd

cwdobuhd3#

我最近遇到了完全相同的问题。通过在尝试注册它之前添加not existing yet选项解决了它。当我试图在sanitize回调函数中执行此操作时,我得到了一个500服务器错误,所以请避免这种情况。

// check if the "fields_associations" option exists
$fields_associations = get_option( "fields_associations" );

// if the "fields_associations" option doesn't exist yet, add it with a default value
if ( $fields_associations === false ) {
    add_option( "fields_associations", '' );
}

// register a new setting with a sanitize/validation callback
register_setting( "plugin_general_settings", "fields_associations", "fields_associations_validation" );

字符串

相关问题