web-dev-qa-db-fra.com

Générer automatiquement des règles de réécriture pour plusieurs taxonomies

donc je suis de retour avec les réécritures ... je cherche une solution plus automatisée.

je suis tombé sur cela sur les interwebs:

/**
 * 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->rewrite['slug']] = $taxonomy->query_var;
        $query_vars[] = $taxonomy->rewrite['slug'] ;
        add_rewrite_tag('%'.$taxonomy->rewrite['slug'].'%','([^&]+)');
    }

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



// add the rules
function mv_add_rewrite_rule($wp_rewrite){
    $new_rules = eg_generate_rewrite_rules('product');
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules','mv_add_rewrite_rule',99);

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

mais bien que cela fonctionne très bien si vous n'avez pas défini de slug de réécriture pour chaque taxonomie personnalisée, il échoue si votre slug de réécriture est différent de votre requête var. (puisqu'il ajoute automatiquement la variable query_var saisie dans la correspondance $ en tant que chaîne de requête.

comment puis-je modifier cette fonction afin qu'elle corresponde au rewrite ['slug'] mais ajoute le query_var associé à la chaîne de requête.

ouf ... j'espère que cela a du sens. OU, est-ce que ça sonne possible? serait-il conseillé de coder en dur les règles de réécriture à la place?

catégories de produits/tissus/couleur/rouge

étiquettes de produit/nouveau/style/jacquard

(catégorie de produit OR étiquette de produit)/(couleur OR style OR style de rognage des matières)

1
helgatheviking

Alors que je me trouve à nouveau sur Google pour réécrire, un an plus tard, je publierai la solution qui m'a été fournie par l'auteur du tutoriel. La solution consistait à définir le query_var souhaité lors de l'enregistrement de la taxonomie.

register_taxonomy( 'product_cat', 'product', array( 'query_var' => 'product-category' ) );
1
helgatheviking