какова самая ранняя точка загрузки страницы WordPress, где я могу обнаружить запрашиваемый пост?

Каково самое раннее действие WordPress, когда сообщение, которое в конечном итоге будет показано, может быть надежно обнаружено? (либо с помощью глобального $post, либо путем обнаружения объекта wp_query или другим способом)

например. моему плагину необходимо обнаружить входящий запрос от другого плагина на другом сайте, в данный момент он проверяет переменную $_POST как можно раньше, используя add_action('plugins_loaded', а функция обратного вызова использует $post = get_page_by_path($_SERVER['REQUEST_URI'],'','post') для получения объекта $post, а затем использует сообщение данные для получения любой другой информации, которая используется для обработки ответа, который отправляется обратно до того, как произойдут какие-либо заголовки или другая стандартная обработка WP с целью уменьшения нагрузки на блог, получающий запрос.

есть ли лучший способ? Я знаю, что нет более раннего способа, потому что действие 'plugins_loaded' вызывается сразу после загрузки плагинов, но есть ли более надежный способ, чем использование get_page_by_path ?


person CommentLuv    schedule 11.05.2011    source источник


Ответы (1)


Я бы попробовал фильтр 'the_posts'. Вы найдете его в wp-includes/query.php функции get_posts(). Он передает найденные сообщения в виде массива по ссылке, поэтому вы можете использовать его как действие.

Вот плагин, который я использую для проверки хуков:

<?php
/*
Plugin Name: Hook Check
Description: Inspects a hook and prints its information to the footer.
Version:     1.0
Required:    3.1
Author:      Thomas Scholz
Author URI:  http://toscho.de
License:     GPL
*/
! defined( 'ABSPATH' ) and exit;

$GLOBALS['hook_checks'] = apply_filters(
    'hook_check_filter'
,   array ( 'the_posts' )
);

foreach ( $GLOBALS['hook_checks'] as $hc_hook )
{
    add_action( $hc_hook, array( 'Hook_Check', 'catch_info' ) );
}
add_action( 'wp_footer', array( 'Hook_Check', 'print_info' ) );

class Hook_Check
{
    static $info = array ();

    public static function catch_info()
    {
        $args = func_get_args();
        self::$info[ current_filter() ] = print_r( $args, TRUE );
        return $args[0];
    }

    public static function print_info()
    {
        if ( empty ( self::$info ) )
        {
            return;
        }

        print '<pre>';
        foreach ( self::$info as $filter => $catched )
        {
            print "<b>$filter</b>\n" . htmlspecialchars( $catched );
        }
        print '</pre>';
    }
}

Уменьшенный образец вывода:

Array
(
    [0] => Array
        (
            [0] => stdClass Object
                (
                    [ID] => 112
                    [post_content] => The entire content …
                    [post_title] => An awesome title
                    [post_excerpt] => 
                    [post_status] => publish
                )
        )
)

Это должно дать вам всю необходимую информацию как можно раньше.

О, и я надеюсь увидеть вас на https://wordpress.stackexchange.com/ с такими вопросами. :)

person fuxia    schedule 11.05.2011
comment
спасибо, но разве функция get_posts() не запускается после отправки заголовков? Мне нужно отправить свои собственные заголовки и контент, а затем выйти, прежде чем WordPress отправит что-либо еще. Я вижу, что parse_query запускается перед send_headers, используя $_SERVER['REQUEST_URI'] для определения запрашиваемой записи/страницы, поэтому я думаю, что и для меня этого будет достаточно :-) спасибо за ваш ответ, я направлю другие вопросы, связанные с WP, на wordpress.stackexchange. ком - person CommentLuv; 12.05.2011
comment
@CommentLuv Да, он запускается позже, но вы все равно можете заменить исходные заголовки, потому что он запускается до любого вывода. - person fuxia; 12.05.2011
comment
да, я полагаю, это правда. Я предполагаю, что иметь объект сообщения будет чище, чем подделывать его с помощью функции пути к объекту сообщения. - person CommentLuv; 13.05.2011