Ajouter un paramètre de tri custom à la page d'archive

Tuto officiel du Codex - Exemple utile - Penser à flush les permaliens à chaque fois pour voir les changements

<?php
class ArchiveFilter
{
	public function __construct()
	{
		add_filter('query_vars', array($this, 'realisation_queryvars') );
		add_action('pre_get_posts', array($this, 'realisation_pre_get_posts') );
		add_action('generate_rewrite_rules', array($this, 'realisation_add_rewrite_rules') );
		return true;
	}

	public function realisation_queryvars ( $qvars )
	{
		$qvars[] = 'realisation'; // On ajoute le paramètre GET realisation à Wordpress
		return $qvars;
	}

	public function realisation_pre_get_posts ( $query )
	{
		if( is_admin() )
		{
			return; // Pas touche aux requêtes en admin
		}

		// Si la variable realisation est passée dans l'url et qu'elle a la bonne valeur, on modifie la requête
		if( isset($query->query_vars['realisation']) )
		{
			if($query->query_vars['realisation'] == 'terrains-a-vendre' || $query->query_vars['realisation'] == 'realisations')
			{
				$query->set('meta_key', 'terrain_a_vendre');
				$query->set('meta_value', $query->query_vars['realisation']);
			}
		}
	}

	public function realisation_add_rewrite_rules ( $wp_rewrite )
	{
		$new_rules = array(
			'terrains-a-vendre\/([^/]+)'	=> 'index.php?terrain-region=$matches[1]&post_type=terrains&realisation=terrains-a-vendre',
			'realisations\/([^/]+)'		=> 'index.php?terrain-region=$matches[1]&post_type=terrains&realisation=realisations',
			'terrains-a-vendre$'		=> 'index.php?post_type=terrains&realisation=terrains-a-vendre',
			'realisations$'			=> 'index.php?post_type=terrains&realisation=realisations',
		);

		//​ Add the new rewrite rule into the top of the global rules array
		$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
	}
}

Note sur le REGEX

http://www.rexegg.com/regex-capture.html ⇒ il est impossible de récupérer plusieurs groupe récursivement et de les appliquer à différentes variables, le REGEX n'est pas fait pour ça. On peut les rentrer en dur ou juste récupérer un mot clé et renvoyer tout ce qui suit et le parser.

Pour faire ça :

'service-technique\/(.+)'			=> 'index.php?service_technique=$matches[1]',

// ...

$st_slug = explode( '/', $st_slug );