add_action sur une fonction de la class WP

Default
,

Bonjour,

J'ai un petit souci, pas forcément simple à expliquer donc je vais vous le raconter depuis le début.
Je suis tombé il y a peu sur une solution intéressante proposé par Google pour indexer des pages en Ajax. Lorsque googe rencontre une url du type http://domaine.com/#!/page , il cherche à accèder à la page http://domaine.com/?_escaped_fragment_=/page . Normalement, une webApp détecte la présence du ?escaped_fragment et renvoie à googlebot un html snapshot de la page à indexer. Seulement voilà, installer une webapp pour ça, c'est un peu un missile nucléaire pour tuer une mouche...

Alors avec un ami on a voulu essayer de faire un thème wordpress en full ajax et de le rendre indexable par google. Mais au lieu de passer par une webApp (headless browser) pour faire un snapshot de la page, on veut simplement détecter la présence de escaped_fragment dans l'url pour servir à google la page voulue. Ona donc changé toutes nos URLs sur le site pour leur donner la forme http://domaine.com/#!/page (mais les articles sont toujours dispos sur les pages http://domaine.com/page , mais ça, google le sait pas...) et donc quand on rentre l'URL http://domaine.com/?_escaped_fragment_=/page, on supprime ?escaped_fragment=/ et le tour est joué. J'ai fais une modif dans le code de wordpress et la solution marche parfaitement, seulement voilà, c'est crade de faire ça dans le coeur de wordpress, j'aimerai le faire de puis le fichier fonctions.php de mon thème, mais ça me renvoie une erreur...

Dans le fichier wp-include/class-wp.php, j'ai changé dans la fonction parse_request la ligne :
[code]$req_uri = $SERVER['REQUEST_URI'];[/code]
par la ligne :
[code]$req_uri = str_replace('?_escaped_fragment
=','',$_SERVER['REQUEST_URI']);[/code]

Ca ça marche, mais quand dans mon functions.php je recopie la fonction "parse_request", que je fais un add_action :
[code]add_action("parse_request", array(&$this, 'my_parse_request'));
function my_parse_request($extra_query_vars = ''){
global $wp_rewrite;

    $this->query_vars = array();
    $post_type_query_vars = array();

    if ( is_array($extra_query_vars) )
        $this->extra_query_vars = & $extra_query_vars;
    else if (! empty($extra_query_vars))
        parse_str($extra_query_vars, $this->extra_query_vars);

    // Process PATH_INFO, REQUEST_URI, and 404 for permalinks.

    // Fetch the rewrite rules.
    $rewrite = $wp_rewrite->wp_rewrite_rules();

    if ( ! empty($rewrite) ) {
        // If we match a rewrite rule, this will be cleared.
        $error = '404';
        $this->did_permalink = true;

        if ( isset($_SERVER['PATH_INFO']) )
            $pathinfo = $_SERVER['PATH_INFO'];
        else
            $pathinfo = '';
        $pathinfo_array = explode('?', $pathinfo);
        $pathinfo = str_replace("%", "%25", $pathinfo_array[0]);
        $req_uri = str_replace('?_escaped_fragment_=','',$_SERVER['REQUEST_URI']); //iciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
        $req_uri_array = explode('?', $req_uri);
        $req_uri = $req_uri_array[0];
        $self = $_SERVER['PHP_SELF'];
        $home_path = parse_url(home_url());
        if ( isset($home_path['path']) )
            $home_path = $home_path['path'];
        else
            $home_path = '';
        $home_path = trim($home_path, '/');

        // Trim path info from the end and the leading home path from the
        // front.  For path info requests, this leaves us with the requesting
        // filename, if any.  For 404 requests, this leaves us with the
        // requested permalink.
        $req_uri = str_replace($pathinfo, '', $req_uri);
        $req_uri = trim($req_uri, '/');
        $req_uri = preg_replace("|^$home_path|", '', $req_uri);
        $req_uri = trim($req_uri, '/');
        $pathinfo = trim($pathinfo, '/');
        $pathinfo = preg_replace("|^$home_path|", '', $pathinfo);
        $pathinfo = trim($pathinfo, '/');
        $self = trim($self, '/');
        $self = preg_replace("|^$home_path|", '', $self);
        $self = trim($self, '/');

        // The requested permalink is in $pathinfo for path info requests and
        //  $req_uri for other requests.
        if ( ! empty($pathinfo) && !preg_match('|^.*' . $wp_rewrite->index . '$|', $pathinfo) ) {
            $request = $pathinfo;
        } else {
            // If the request uri is the index, blank it out so that we don't try to match it against a rule.
            if ( $req_uri == $wp_rewrite->index )
                $req_uri = '';
            $request = $req_uri;
        }

        $this->request = $request;

        // Look for matches.
        $request_match = $request;
        foreach ( (array) $rewrite as $match => $query) {
            // Don't try to match against AtomPub calls
            if ( $req_uri == 'wp-app.php' )
                break;

            // If the requesting file is the anchor of the match, prepend it
            // to the path info.
            if ( (! empty($req_uri)) && (strpos($match, $req_uri) === 0) && ($req_uri != $request) )
                $request_match = $req_uri . '/' . $request;

            if ( preg_match("#^$match#", $request_match, $matches) ||
                preg_match("#^$match#", urldecode($request_match), $matches) ) {
                // Got a match.
                $this->matched_rule = $match;

                // Trim the query of everything up to the '?'.
                $query = preg_replace("!^.+\?!", '', $query);

                // Substitute the substring matches into the query.
                $query = addslashes(WP_MatchesMapRegex::apply($query, $matches));

                $this->matched_query = $query;

                // Parse the query.
                parse_str($query, $perma_query_vars);

                // If we're processing a 404 request, clear the error var
                // since we found something.
                if ( isset($_GET['error']) )
                    unset($_GET['error']);

                if ( isset($error) )
                    unset($error);

                break;
            }
        }

        // If req_uri is empty or if it is a request for ourself, unset error.
        if ( empty($request) || $req_uri == $self || strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) {
            if ( isset($_GET['error']) )
                unset($_GET['error']);

            if ( isset($error) )
                unset($error);

            if ( isset($perma_query_vars) && strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false )
                unset($perma_query_vars);

            $this->did_permalink = false;
        }
    }

    $this->public_query_vars = apply_filters('query_vars', $this->public_query_vars);

    foreach ( $GLOBALS['wp_post_types'] as $post_type => $t )
        if ( $t->query_var )
            $post_type_query_vars[$t->query_var] = $post_type;

    foreach ( $this->public_query_vars as $wpvar ) {
        if ( isset( $this->extra_query_vars[$wpvar] ) )
            $this->query_vars[$wpvar] = $this->extra_query_vars[$wpvar];
        elseif ( isset( $_POST[$wpvar] ) )
            $this->query_vars[$wpvar] = $_POST[$wpvar];
        elseif ( isset( $_GET[$wpvar] ) )
            $this->query_vars[$wpvar] = $_GET[$wpvar];
        elseif ( isset( $perma_query_vars[$wpvar] ) )
            $this->query_vars[$wpvar] = $perma_query_vars[$wpvar];

        if ( !empty( $this->query_vars[$wpvar] ) ) {
            if ( ! is_array( $this->query_vars[$wpvar] ) ) {
                $this->query_vars[$wpvar] = (string) $this->query_vars[$wpvar];
            } else {
                foreach ( $this->query_vars[$wpvar] as $vkey => $v ) {
                    if ( !is_object( $v ) ) {
                        $this->query_vars[$wpvar][$vkey] = (string) $v;
                    }
                }
            }

            if ( isset($post_type_query_vars[$wpvar] ) ) {
                $this->query_vars['post_type'] = $post_type_query_vars[$wpvar];
                $this->query_vars['name'] = $this->query_vars[$wpvar];
            }
        }
    }

    // Convert urldecoded spaces back into +
    foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t )
        if ( $t->query_var && isset( $this->query_vars[$t->query_var] ) )
            $this->query_vars[$t->query_var] = str_replace( ' ', '+', $this->query_vars[$t->query_var] );

    // Limit publicly queried post_types to those that are publicly_queryable
    if ( isset( $this->query_vars['post_type']) ) {
        $queryable_post_types = get_post_types( array('publicly_queryable' => true) );
        if ( ! is_array( $this->query_vars['post_type'] ) ) {
            if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types ) )
                unset( $this->query_vars['post_type'] );
        } else {
            $this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types );
        }
    }

    foreach ( (array) $this->private_query_vars as $var) {
        if ( isset($this->extra_query_vars[$var]) )
            $this->query_vars[$var] = $this->extra_query_vars[$var];
    }

    if ( isset($error) )
        $this->query_vars['error'] = $error;

    $this->query_vars = apply_filters('request', $this->query_vars);

    do_action_ref_array('parse_request', array(&$this));
}[/code]

Ca me renvoie un warning (mais ça fonctionne tout de même) : [b]Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'Array' was given in /web/wuiwui1/ajax/wp-includes/plugin.php on line 486[/b];

Comment ça se fait, d'où ça vient, comment m'en débarrasser ? (je précise que je n'ai aucun plugin d'installé)...

Merci d'avance !