web-dev-qa-db-fra.com

Création d'une structure d'URL dynamique

Je souhaite créer une structure de répertoires pour mes liens WordPress et pour que la dernière page soit basée sur la taxonomie de la page.

J'ai donc une entreprise qui appartient à city (méta) et country (taxonomie). J'aimerais que l'URL finale soit

http://example.com/{country}/{city}/{post_title}/

Est-ce possible? J'ai essayé add_rewrite_rule() mais il ne peut pas faire ce que je veux ou je le fais mal (je me suis débarrassé du code, je ne peux donc pas le montrer, désolé).

1
WolfieZero

Démontré ici:

http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/

Voici le code final pour générer automatiquement les règles nécessaires:

Il est fort probable que vous souhaiterez à un moment donné générer par programme des règles de réécriture pour plusieurs types d'articles personnalisés avec différentes taxonomies. Vous pouvez le faire manuellement, mais ce n’est pas amusant. Utilisons un générateur de règles de réécriture automatique.

La fonction ci-dessous prend un type de publication comme premier paramètre et crée une série de règles de réécriture pour chacune de ses taxonomies. La fonction inclut également un second paramètre facultatif, $ query_vars, qui est un tableau de toutes les variables de requête non taxonomiques auxquelles vous pouvez ajouter des règles de réécriture. C’est l’idéal pour ajouter des vars de requête aux requêtes de métadonnées avancées. Par exemple, notre type de publication d'événement pourrait utiliser une variable de requête de date.

/**
 * Generates all the rewrite rules for a given post type.
 *
 * The rewrite rules allow a post type to be filtered by all possible combinations & permutations
 * of taxonomies that apply to the specified post type and additional query_vars specified with
 * the $query_vars parameter.
 *
 * Must be called from a function hooked to the 'generate_rewrite_rules' action so that the global
 * $wp_rewrite->preg_index function returns the correct value.
 *
 * @param string|object $post_type The post type for which you wish to create the rewrite rules
 * @param array $query_vars optional Non-taxonomy query vars you wish to create rewrite rules for. Rules will be created to capture any single string for the query_var, that is, a rule of the form '/query_var/(.+)/'
 *
 * @author Brent Shepherd <[email protected]>
 * @since 1.0
 */
function eg_generate_rewrite_rules( $post_type, $query_vars = array() ) {
    global $wp_rewrite;

    if( ! is_object( $post_type ) )
        $post_type = get_post_type_object( $post_type );

    $new_rewrite_rules = array();

    $taxonomies = get_object_taxonomies( $post_type->name, 'objects' );

    // Add taxonomy filters to the query vars array
    foreach( $taxonomies as $taxonomy )
        $query_vars[] = $taxonomy->query_var;

    // Loop over all the possible combinations of the query vars
    for( $i = 1; $i <= count( $query_vars );  $i++ ) {

        $new_rewrite_rule =  $post_type->rewrite['slug'] . '/';
        $new_query_string = 'index.php?post_type=' . $post_type->name;

        // Prepend the rewrites & queries
        for( $n = 1; $n <= $i; $n++ ) {
            $new_rewrite_rule .= '(' . implode( '|', $query_vars ) . ')/(.+?)/';
            $new_query_string .= '&' . $wp_rewrite->preg_index( $n * 2 - 1 ) . '=' . $wp_rewrite->preg_index( $n * 2 );
        }

        // Allow paging of filtered post type - WordPress expects 'page' in the URL but uses 'paged' in the query string so paging doesn't fit into our regex
        $new_paged_rewrite_rule = $new_rewrite_rule . 'page/([0-9]{1,})/';
        $new_paged_query_string = $new_query_string . '&paged=' . $wp_rewrite->preg_index( $i * 2 + 1 );

        // Make the trailing backslash optional
        $new_paged_rewrite_rule = $new_paged_rewrite_rule . '?$';
        $new_rewrite_rule = $new_rewrite_rule . '?$';

        // Add the new rewrites
        $new_rewrite_rules = array( $new_paged_rewrite_rule => $new_paged_query_string,
                                    $new_rewrite_rule       => $new_query_string )
                             + $new_rewrite_rules;
    }

    return $new_rewrite_rules;
}
2
Tom J Nowell