J'ai fait quelque chose de très similaire il n'y a pas longtemps, et je l'ai fait en trichant. Si vous trouvez les règles de réécriture intégrées trop compliquées ou incapables de faire le travail, il vous sera peut-être plus facile d'intercepter la requête et de filtrer les résultats. Une version simplifiée:
add_action('parse_request', 'my_parse_request');
function my_parse_request (&$wp) {
$path = $wp->request;
$groups = array();
if (preg_match("%shop/product/([a-zA-Z0-9-]+)%", $path, $groups)) {
$code = $groups[1];
$product = get_product($code); // your own code here
if (isset($product)) {
add_filter('the_posts', 'my_product_filter_posts');
}
}
}
function my_product_filter_posts ($posts) {
ob_start();
echo "stuff goes here"; // your body here
$content = ob_get_contents();
ob_end_clean();
return array(new DummyResult(0, "Product name", $content));
}
Pour expliquer:
L'action sur parse_request
est appelée avant la base de données recherche. Basé sur l'URL, il installe les autres actions et filtres.
Le filtre sur les publications remplace les résultats de la recherche dans la base de données par de faux résultats.
DummyResult est une classe simple qui a les mêmes champs en poste, ou juste assez pour sortir avec elle:
class DummyResult {
public $ID;
public $post_title;
public $post_content;
public $post_author;
public $comment_status = "closed";
public $post_status = "publish";
public $ping_status = "closed";
public $post_type = "page";
public $post_date = "";
function __construct ($ID, $title, $content) {
$this->ID = $ID;
$this->post_title = $title;
$this->post_content = $content;
$this->post_author = get_default_author(); // implement this function
}
}
Il y a beaucoup de devoirs à gauche pour le lecteur dans la ci-dessus, mais c'est une approche de travail laide. Vous voudrez probablement ajouter un filtre pour template_redirect
, pour remplacer le modèle de page normal par un modèle spécifique au produit. Et vous devrez peut-être ajuster l'URL regex si vous voulez de jolis permaliens.