web-dev-qa-db-fra.com

Utilisation de champs personnalisés dans une URL de type de publication personnalisée

Je développe un site de voiture qui a des salles d'exposition. Chaque showroom a besoin de sa propre URL personnalisée en fonction de son emplacement. L'emplacement (ville et comté/État) est déjà inséré sous la forme de deux champs personnalisés. Ainsi, par exemple, s'il s'agit de la "salle d'exposition A" située à Liverpool, dans le Merseyside, son adresse URL serait la suivante: -

http://www.domain.com/location/merseyside/liverpool/showroom-a/

J'ai un type de publication personnalisé de "Showroom", dont les règles de réécriture sont définies sur false (bien qu'il ait déjà été défini sur true plus tôt dans le test). Cependant, lorsque je crée le poste en question, il y a un problème. Le permalien est donné comme partout BAR le nom de la salle d'exposition (c'est-à-dire http://www.domain.com/location/merseyside/liverpool/ ). Visting cette URL provoque une erreur 404, et même en ajoutant "showroom-a" (par exemple) à la fin du code ( http://www.domain.com/location/merseyside/liverpool/showroom-a/ ), provoque également une erreur 404. Voici mon code.

function add_rewrite_rules()
{
    // Register custom rewrite rules

    global $wp_rewrite;

    $wp_rewrite->add_rewrite_tag('%showroom%', '([^/]+)', 'showroom=');
    $wp_rewrite->add_rewrite_tag('%post_custom_data%', '([^/]+)', 'post_custom_data=');
    $wp_rewrite->add_permastruct('showroom', 'location/%post_custom_data%', false);

}

function permalinks($permalink, $post, $leavename)
{
    $no_data = 'no-data';
    $post_id = $post->ID;

    if($post->post_type != 'showroom' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) {
        return $permalink;
    }

    $state = sanitize_title_with_dashes(get_post_meta($post_id, 'state', true));
    $city =  sanitize_title_with_dashes(get_post_meta($post_id, 'city', true));
    $data = $state . "/" . $city;

    if (!$data) {
        $data = $no_data;
    }

    $permalink = str_replace('%post_custom_data%', $data, $permalink);

    return $permalink;    
}

add_action('init', 'add_rewrite_rules');
add_filter('post_type_link', 'permalinks', 10, 3);

Toute idée ou aide serait appréciée :)

5
Rhys Wynne

J'ai réussi à résoudre ce problème.

En gros, j'ai changé le permastruct en ceci:

$wp_rewrite->add_permastruct('showroom', 'location/%state%/%city%/%showroom%', false);

J'ai ensuite saisi state & city sous la forme de deux variables distinctes, en les remplaçant dans la structure permalink à l'aide des lignes suivantes:

$permalink = str_replace('%state%', $state, $permalink);
$permalink = str_replace('%city%', $city, $permalink);

Avec $state & $city capturé en utilisant get_post_meta de la poste.

4
Rhys Wynne