Annonce

Faites la différence entre le service WordPress.com et l'application libre WordPress.

Mettez-vous à jour ! WordPress 3.9 est disponible en français.

Annonce 1 : Le Codex en français a besoin de vous pour avancer !
Annonce 2 : Avant de poster, n'oubliez pas de faire une petite recherche et de lire les règles de ce forum.
Annonce 3 : Lisez notre blog, il regorge de bonnes informations.
Annonce 4 : Rejoignez-nous sur Facebook, Google + et sur Twitter

#1 16-07-2011 13:46:23

willy bahuaud
Membre WP
Date d'inscription: 13-03-2010
Messages: 1

add_action sur parse_request

Bonjour,

Ma configuration WP actuelle
- Version de WordPress : 3.2
- Adresse du site : http://ajax.wuiwui.net

Problème(s) rencontré(s) :

Voilà, je travail actuellement sur un thème Full ajax et la possibilité de le rendre indexable dans google.
Je ne sais pas si vous connaissez l'astuce du _escaped_fragment_ mais ça marche très bien sur ce site.

Mon souci vient pluôt de la façon de coder mon truc : directement dans le cœur de wordpress, dans le fichier class-wp.php, dans la fonction parse_request de la class WP, j'ai du changer une ligne... c'est crade...fouet

J'ai modifié

Code: html

$req_uri =$_SERVER['REQUEST_URI'];

en

Code: html

$req_uri = str_replace('?_escaped_fragment_=','',$_SERVER['REQUEST_URI']);

je sais, c'est hyper crade, mais c'est le seul moyen que j'ai trouvé pour que google accède à mon contenu.
J'essaye de faire cette modification directement à partir du fichier fonctions.php de mon thème (avec un add_filter/add_action) mais je n'y arrive pas vraiment... ça me génère une erreur.

J'ai recopier l'intégralité de la fonction parse request, ajouté un add_action, et modifié la ligne qui m’intéresse (mais vu que c'est un objet, le callbackest un array):

Code: html

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));
	}

Et voilà avec ça, j'obtient ce que je veux, mais avec un joli "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" en plus...

Savez-vous comment je pourrai faire plus propre ?? Sans obtenir le warning, au moins ?sad

Merci d'avance !!

PS: dès que ça marche complètement j'en ferait un tutoriel pour expliquer comment ça marche et comment rendre son contenu ajax indexable par google (sans utiliser de headless browser) big_smile

Hors ligne

 

#2 19-07-2011 09:17:51

SeoMix
Habitué WP
Lieu: Nantes
Date d'inscription: 18-12-2008
Messages: 51
Site web

Re: add_action sur parse_request

Essaye avec :

Code: html

add_action("parse_request", 'my_parse_request');

(sur une idée de BoiteaWeb)


WordPress Fanboy - SEO Addict

WordPress sur SeoMix, c'est des conseils et tutoriaux pour utiliser au mieux ce CMS.

Hors ligne

 

#3 19-07-2011 09:26:33

rouge13
Membre WP
Lieu: Nantes
Date d'inscription: 11-07-2011
Messages: 5
Site web

Re: add_action sur parse_request

Code: html

add_action("parse_request", 'my_parse_request');

C'est ce que j'ai essayé en premier, car c'est le plus logique. Mais non... j'obtient ça :

Fatal error: Using $this when not in object context in /xxx/xxx/xxx/wp-content/themes/themeajax/functions.php on line 41

Car la fonction d'origine est dans la class WP, cette fonction fait donc appel à un objet... d'où le $this.

hmm

Dernière modification par rouge13 (19-07-2011 09:27:47)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB 1.2.23
© Copyright 2005-2006 WordPress France

[ Generated in 0.786 seconds, 11 queries executed ]