包含‘wp-includes’类的最佳实践是什么

时间:2013-06-13 作者:emeraldjava

我有一个类“wp\\u php\\u flickr”,它将在我正在编写的插件中使用wordpress核心类“wp\\u HTTP”

if( !class_exists( \'WP_Http\' ) ) {
    require_once( WP_INSTALL_DIR.\'\\wp-includes\\class-http.php\');
}

class wp_php_flickr {
...
}
在测试过程中,我注意到我需要包含越来越多的核心类,WP\\U HTTP类依赖于这些核心类

require_once( WP_INSTALL_DIR.\'\\wp-includes\\plugin.php\');
require_once( WP_INSTALL_DIR.\'\\wp-includes\\general-template.php\');
require_once( WP_INSTALL_DIR.\'\\wp-includes\\link-template.php\');
require_once( WP_INSTALL_DIR.\'\\wp-includes\\option.php\');
require_once( WP_INSTALL_DIR.\'\\wp-includes\\cache.php\');
我想知道是否有更聪明或更好的方法来确保所需的依赖类自动提供给我的类?

1 个回复
SO网友:kaiser

先决条件首先,所有回调(别名:运行时函数/方法)都应该附加到可预测的挂钩。示例:

add_action( \'plugins_loaded\', \'wpse_102852_bootstrap\' );
function wpse_102852_bootstrap()
{
    // Time to attach the plugins callbacks
    add_action( \'wp_loaded\', \'some_callback\' );
}
此回调连接到插件可用的第一个挂钩。现在,其他插件知道您的插件何时加载和连接挂钩。

您需要将所有执行的任务包装到类中的方法中,并将它们附加到引导/构造函数方法中。在那里,您将这些方法附加到挂钩。

运行HTTP远程请求WP HTTP API 提供一组方便的公共API函数和过滤器,可用于执行请求。

首先,您可能需要根据需要使用以下功能之一:

wp_remote_head() 功能通常仅用于测试某些所需的header.

完成请求后,您可以测试和验证是否存在错误:

$request = wp_remote_request( array( /* your arguments */ ) );
// Quite handy that wrong responses are return as WP_Error object
if (
    is_wp_error( $request )
    // Most remote APIs send the wrong response codes and tell your everything is fine
    // just to use their own bogus error messages to annoy the shit out of you.
    // So the following two lines are in 90% of all cases senseless.
    OR 200 !== wp_remote_retrieve_response_code( $request )
    OR "OK" !== wp_remote_retrieve_response_message( $request )
    )
{
    // If the remote API has good response codes, you can use above
    // wp_remote_retrieve_response_code( $request ) as well to get for example 3**, 4** and 5** codes
    return printf( \'%s: %s\',
        $request->get_error_code(),
        wp_strip_all_tags( $response->get_error_message() )
    );
}
现在你得到了回应。剩下的问题是它的格式是什么。只需使用普通的PHP函数,如json_decode() 对于JSON响应,simplexml_load_string() 或类似的字符串等。

最后,是时候获取实际数据了。

// The actual content of the response
$content = wp_remote_retrieve_body( $request );
// An array of headers:
$headers = wp_remote_retrieve_headers( $request );
// An single header: the time the remote data was \'last-modified\' for example
// This is helpful to check for remote updates in combination with wp_remote_head()
$headers = wp_remote_retrieve_header( $request, \'last-modified\' );
最后一项任务是——在接触内容并测试是否得到JSON、XML、XLS、CSV等之前——做一些准备。总是要做的第一件事就是trim(): 几乎每个提供者都会意外地在响应周围填充空格。

$content = trim( $content );
$content = array_map( \'esc_attr\', $content );
// Now check if we got JSON, XML, etc. and process your data.
// Don\'t forget to use the `esc_*()` functions on the single elements
// Example:
$title = esc_html( $content[\'title\'] );
// etc.
完整的示例现在有一个示例可以做两件事:

执行远程请求

add_action( \'plugins_loaded\', array( \'WPSE_102852_Flickr\', \'init\' ) );
class WPSE_102852_Flickr
{
    protected static $instance = null;

    public static init()
    {
        null === self::$instance AND self::$instance = new self;
        return self::$instance;
    }

    public function __construct()
    {
        add_action( \'wp_loaded\', array( $this, \'remote_request\' );
    }

    public function remote_request()
    {
        // All the logic for the remote request goes in here.
        // Finally you want to save the data somewhere.
        foreach ( $results as $result )
             wp_insert_post( /* your data as post data */ );
    }
}
现在,您可以在模板中执行以下操作:

$remote_posts = new WP_Query( array( /* your args */ ) );
if ( $remote_posts->have_posts() )
{
    while( $remote_posts->have_posts() )
    {
        the_post();

        the_title();
        the_content();
    }
}
wp_reset_query();
unset( $remote_posts );

结束

相关推荐