如何处理XML-RPC中的快捷码

时间:2013-01-26 作者:Trevor Anderson

首先,我知道XML-RPC是用来发送原始post数据的,但我需要它来扩展短代码。我不使用它来发帖,所以这里不会有问题,但有一些服务正在从中获取帖子,他们得到的是短代码[],而不是扩展的短代码。我想切换到RSS,但我不能。我已经过期,但无法在wp xmlrpc server类中使用do\\u短代码。php谢谢。

2 个回复
SO网友:kaiser

行为说明

在运行时(在面向公众的视图上呈现和显示帖子时)将处理短代码。在保存post期间,它绝对不是一个预处理器。接收方根本没有您的解析器(即处理短代码的函数),因此将得到原始结果。

如何“修复”它只需预先注意:当你这样做时,它是不可逆的。短代码将被转换为任何替换的内容,结果将保存为帖子内容。

您将要使用

  • save_post 钩子以预处理帖子,并用其实际内容替换快捷码标记。您可能需要考虑的另一个选项是

    获取您想要使用的短代码get_shortcode_regex().

    挂钩和XML RPC

    我不确定以下方法是否有效。众所周知,一个人可以extend the XML RPC interface, 但似乎有一些选项/挂钩可以更改返回的值(至少它还可以查询帖子)。

    Matthew Murow 说明,您可以(在插件中)检查是否有XML RPC请求,然后在挂钩期间拦截:

    if ( 
        defined ( \'XMLRPC_REQUEST\' )
        AND XMLRPC_REQUEST
    )
        add_action( \'xmlrpc_call\', \'example_xmlrpc_posts_callback\' );
    
    在回调函数中,钩住pre_get_posts (…)滤器

    这看起来类似于:

    function example_xmlrpc_posts_callback( $task )
    {
        if ( \'wp.getPosts\' !== $task )
            return;
    
        add_filter( \'pre_get_posts\', \'xmlrpc_pre_get_posts\' );
    }
    function xmlrpc_pre_get_posts( $data )
    {
        // Only run once - do not intercept later queries
        remove_filter( current_filter(), __FUNCTION__, 10 );
    
        // Alter output:
        // pre-process shortcodes
    
        return $data;
    }
    

SO网友:Mark Kaplun

这不是WordPress想要使用的XML-RPC编辑方法实现的方式。XML-RPC是一种发布协议,您基本上希望打破最基本的编辑规则,即获取文件并保存而不进行修改将导致完全相同的文件。

在实际层面上,您需要区分获得“原始”数据的用户和获得已处理数据的用户。完成后,可以挂接xmlrpc\\u prepare\\u post过滤器

add_filter(\'xmlrpc_prepare_post\',\'wpse_83217_xml_post\',10,3);

function wpse_83217_xml_post($_post, $post, $fields) {
  if (user gets processed post) {
    $_post[\'post_content\'] = do_shortcodes($post[\'post_content\']);
  }
  return $_post;
}
未测试,并且不知道在调用之前是否需要运行其他任何操作do_shortcodes 为使其工作(可能设置全局$后var,可能需要使用the_content 过滤器)。

但您真正应该做的是声明一个新的XML-RPC方法xmlrpc_methods 不管你想怎么过滤和处理它。这也需要对客户机进行调整,但这是实现您想要的更干净的方法。

结束

相关推荐

清理/过滤通过XML RPC插入到发布内容的HTML

一个使用XML RPC在我的网站上发布一些帖子的外部服务将一些不需要的CSS样式和HTML添加到帖子内容中。我想使用基于DOMDocument和DOMXPath构建的HTML清理器来清理它。我唯一的问题是,如何在post\\u内容实际保存到数据库之前访问它,以便在其上运行我的清理程序?也许我可以使用一个过滤器/操作?