如何将XML-RPC API的更多选项列入白名单?

如何将XML-RPC API的更多选项列入白名单?

问题描述:

在将REST API端点添加到WordPress核心之前,我需要一种以编程方式更新默认情况下XML-RPC API不包含的选项的方法。它看起来像在文件中添加的选项,“WP-包括/类WP-XML-RPC-server.php”通过下面的方法:如何将XML-RPC API的更多选项列入白名单?

public function initialise_blog_option_info() { 
    global $wp_version; 

    $this->blog_options = array(
     // Read only options 
     'software_name'  => array(
      'desc'   => __('Software Name'), 
      'readonly'  => true, 
      'value'   => 'WordPress' 
     ), 
     'software_version' => array(
      'desc'   => __('Software Version'), 
      'readonly'  => true, 
      'value'   => $wp_version 
     ), 
     'blog_url'   => array(
      'desc'   => __('WordPress Address (URL)'), 
      'readonly'  => true, 
      'option'  => 'siteurl' 
     ), 
     'home_url'   => array(
      'desc'   => __('Site Address (URL)'), 
      'readonly'  => true, 
      'option'  => 'home' 
     ), 
     'login_url'   => array(
      'desc'   => __('Login Address (URL)'), 
      'readonly'  => true, 
      'value'   => wp_login_url() 
     ), 
     'admin_url'   => array(
      'desc'   => __('The URL to the admin area'), 
      'readonly'  => true, 
      'value'   => get_admin_url() 
     ), 
     'image_default_link_type' => array(
      'desc'   => __('Image default link type'), 
      'readonly'  => true, 
      'option'  => 'image_default_link_type' 
     ), 
     'image_default_size' => array(
      'desc'   => __('Image default size'), 
      'readonly'  => true, 
      'option'  => 'image_default_size' 
     ), 
     'image_default_align' => array(
      'desc'   => __('Image default align'), 
      'readonly'  => true, 
      'option'  => 'image_default_align' 
     ), 
     'template'   => array(
      'desc'   => __('Template'), 
      'readonly'  => true, 
      'option'  => 'template' 
     ), 
     'stylesheet'  => array(
      'desc'   => __('Stylesheet'), 
      'readonly'  => true, 
      'option'  => 'stylesheet' 
     ), 
     'post_thumbnail' => array(
      'desc'   => __('Post Thumbnail'), 
      'readonly'  => true, 
      'value'   => current_theme_supports('post-thumbnails') 
     ), 

     // Updatable options 
     'time_zone'   => array(
      'desc'   => __('Time Zone'), 
      'readonly'  => false, 
      'option'  => 'gmt_offset' 
     ), 
     'blog_title'  => array(
      'desc'   => __('Site Title'), 
      'readonly'  => false, 
      'option'  => 'blogname' 
     ), 
     'blog_tagline'  => array(
      'desc'   => __('Site Tagline'), 
      'readonly'  => false, 
      'option'  => 'blogdescription' 
     ), 
     'date_format'  => array(
      'desc'   => __('Date Format'), 
      'readonly'  => false, 
      'option'  => 'date_format' 
     ), 
     'time_format'  => array(
      'desc'   => __('Time Format'), 
      'readonly'  => false, 
      'option'  => 'time_format' 
     ), 
     'users_can_register' => array(
      'desc'   => __('Allow new users to sign up'), 
      'readonly'  => false, 
      'option'  => 'users_can_register' 
     ), 
     'thumbnail_size_w' => array(
      'desc'   => __('Thumbnail Width'), 
      'readonly'  => false, 
      'option'  => 'thumbnail_size_w' 
     ), 
     'thumbnail_size_h' => array(
      'desc'   => __('Thumbnail Height'), 
      'readonly'  => false, 
      'option'  => 'thumbnail_size_h' 
     ), 
     'thumbnail_crop' => array(
      'desc'   => __('Crop thumbnail to exact dimensions'), 
      'readonly'  => false, 
      'option'  => 'thumbnail_crop' 
     ), 
     'medium_size_w'  => array(
      'desc'   => __('Medium size image width'), 
      'readonly'  => false, 
      'option'  => 'medium_size_w' 
     ), 
     'medium_size_h'  => array(
      'desc'   => __('Medium size image height'), 
      'readonly'  => false, 
      'option'  => 'medium_size_h' 
     ), 
     'medium_large_size_w' => array(
      'desc'   => __('Medium-Large size image width'), 
      'readonly'  => false, 
      'option'  => 'medium_large_size_w' 
     ), 
     'medium_large_size_h' => array(
      'desc'   => __('Medium-Large size image height'), 
      'readonly'  => false, 
      'option'  => 'medium_large_size_h' 
     ), 
     'large_size_w'  => array(
      'desc'   => __('Large size image width'), 
      'readonly'  => false, 
      'option'  => 'large_size_w' 
     ), 
     'large_size_h'  => array(
      'desc'   => __('Large size image height'), 
      'readonly'  => false, 
      'option'  => 'large_size_h' 
     ), 
     'default_comment_status' => array(
      'desc'   => __('Allow people to post comments on new articles'), 
      'readonly'  => false, 
      'option'  => 'default_comment_status' 
     ), 
     'default_ping_status' => array(
      'desc'   => __('Allow link notifications from other blogs (pingbacks and trackbacks) on new articles'), 
      'readonly'  => false, 
      'option'  => 'default_ping_status' 
     ) 
    ); 

    /** 
    * Filter the XML-RPC blog options property. 
    * 
    * @since 2.6.0 
    * 
    * @param array $blog_options An array of XML-RPC blog options. 
    */ 
    $this->blog_options = apply_filters('xmlrpc_blog_options', $this->blog_options); 
} 

这里是我的编辑选项失败的尝试,让更新BLOG_URL,在我functions.php文件HOME_URL和WPCF7选项(SITE_URL和HOME_URL在原有功能是只读):

public function blog_option_info() { 
    global $wp_version; 

    $this->blog_options = array(
     // Updatable options 
     'blog_url'   => array(
      'desc'   => __('WordPress Address (URL)'), 
      'readonly'  => false, 
      'option'  => 'siteurl' 
     ), 
     'home_url'   => array(
      'desc'   => __('Site Address (URL)'), 
      'readonly'  => false, 
      'option'  => 'home' 
     ), 
     'wpcf7'    => array(
      'desc'   => __('Contact Form 7 Options'), 
      'readonly'  => false, 
      'option'  => 'wpcf7' 
     ), 
    ); 
    $this->blog_options = apply_filters('xmlrpc_blog_options', $this->blog_options); 
} 

什么是白名单更多选择正确的方式,使自己能得到并通过API更新它们?

自己刚刚遇到这个问题,绝对没有提及如何在网上做。您的文章指出,列入白名单的选项在$ this-> blog_options中有所帮助,尽管如此谢谢!下面是代码(这是一个自定义的插件):

<?php 
include_once(ABSPATH . WPINC . '/class-IXR.php'); 
include_once(ABSPATH . WPINC . '/class-wp-xmlrpc-server.php'); 

class LSEOP_XmlRpc extends wp_xmlrpc_server { 

    private $version = 1.0; 

    public function __construct() { 
     parent::__construct(); 

     $this->blog_options['permalink_structure'] = [ 
      'desc'   => __('Permalink Structure'), 
      'readonly'  => false, 
      'option'  => 'permalink_structure' 
     ]; 
    } 

    public static function lseop_getName() { 
     return __CLASS__; 
    } 

} 

add_filter('wp_xmlrpc_server_class', array('LSEOP_XmlRpc', 'lseop_getName')); 
?> 

有一个在插件很多其他的代码,因为我还加入了XML-RPC方法,但应该是你需要的一切。

如果您想通过XML-RPC添加读/写选项支持与名称NAME_OF_SOME_OPTION选项,下面的代码添加到您的functions.php:

add_filter('xmlrpc_blog_options', function($blog_options) 
    { 
     $blog_options['NAME_OF_SOME_OPTION'] = array(
      'desc'  => 'DESCRITPTION OF THE OPTION', 
      'readonly' => false, 
      'option' => 'NAME_OF_SOME_OPTION' 
     ); 
     return $blog_options; 
    }); 

如果你希望能够到通过XML-RPC更新选项blog_url,写入以下内容:

add_filter('xmlrpc_blog_options', function($blog_options) 
    { 
     $blog_options['blog_url']['readonly'] = false; 
     return $blog_options; 
    });