web-dev-qa-db-fra.com

Suppression des liens de format de base avec le comportement parent-enfant

J'utilise l'astuce "standard" pour supprimer des catégories dans wordpress. Dans mes permaliens, je règle la structure des permaliens sur

/%category%/%postname%/

Et ma base de catégorie à

.

Ce qui a bien fonctionné, jusqu'à ce que le client indique qu'il souhaite que les catégories de parents apparaissent dans l'en-tête de l'article et que les catégories d'enfants s'affichent dans le pied de page des articles sur les pages d'accueil/index ...

Je l'ai mis en place, mais le problème est que mes liens de catégories enfants sont maintenant:

http://www.example.com/./parent_category/child_category

Et lorsque je clique sur la catégorie enfant, je suis envoyé au dernier article.

J'ai essayé d'ajouter dans mon .htaccess

RewriteRule ^category/(.+)$ http://www.example.com/$1 [R=301,L]

Mais cela n'a rien fait.

Maintenant tout cela fonctionne, quand je supprime le point, mais alors mes liens ressemblent à:

http://www.example.com/category/parent_category/child_category

Et le client explicitement ne veut pas category/ dans le lien ...

Que puis-je faire à part installer un plugin? Comment trier ça? Puis-je avoir

http://www.example.com/parent_category/child_category

En tant que mon lien permanent, et si oui, comment y parvenir?

1
dingo_d

Le "." méthode était toujours un kludge improbable.

Le plug-in "Supprimer l'URL de la catégorie" fonctionne correctement et, selon mon expérience, comme annoncé. Je ne suis pas sûr que l’aversion pour l’installation d’un plug-in à cette fin soit à la base, mais si vous ne le souhaitez pas pour une raison quelconque, vous pouvez toujours l’examiner, puis le copier et le réduire au minimum. technique utilisée par les développeurs du plug-in, bien que le code, qui repose sur la maîtrise des règles intégrées, ne soit en réalité pas très compliqué. Le fichier principal ne contient que 128 lignes et la fonctionnalité principale en contient environ 100, couvrant quatre actions et quatre filtres.

Si vous ne souhaitez pas l'installer en tant que plug-in, je suppose que vous pouvez simplement supprimer les fonctions/fichiers d'installation et les fonctionnalités pratiques du plug-in, et ajouter les fonctions principales à votre fichier de fonctions de thème. Je soupçonne que quelle que soit la méthode que quiconque rédige ici est susceptible de réinventer la même roue.

/**
 * Plugin Name: Remove Category URL
 * Plugin URI: http://valeriosouza.com.br/portfolio/remove-category-url/
 * Description: This plugin removes '/category' from your category permalinks. (e.g. `/category/my-category/` to `/my-category/`)
 * Version: 1.1
 * Author: Valerio Souza, WordLab Academy
 * Author URI: http://valeriosouza.com.br/
 */

/* hooks */
register_activation_hook( __FILE__,   'remove_category_url_refresh_rules' );
register_deactivation_hook( __FILE__, 'remove_category_url_deactivate' );

/* actions */
add_action( 'created_category', 'remove_category_url_refresh_rules' );
add_action( 'delete_category',  'remove_category_url_refresh_rules' );
add_action( 'edited_category',  'remove_category_url_refresh_rules' );
add_action( 'init',             'remove_category_url_permastruct' );

/* filters */
add_filter( 'category_rewrite_rules', 'remove_category_url_rewrite_rules' );
add_filter( 'query_vars',             'remove_category_url_query_vars' );    // Adds 'category_redirect' query variable
add_filter( 'request',                'remove_category_url_request' );       // Redirects if 'category_redirect' is set
add_filter( 'plugin_row_meta',        'remove_category_url_plugin_row_meta', 10, 4 );

function remove_category_url_refresh_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

function remove_category_url_deactivate() {
    remove_filter( 'category_rewrite_rules', 'remove_category_url_rewrite_rules' ); // We don't want to insert our custom rules again
    remove_category_url_refresh_rules();
}

/**
 * Removes category base.
 *
 * @return void
 */
function remove_category_url_permastruct() {
    global $wp_rewrite, $wp_version;

    if ( 3.4 <= $wp_version ) {
        $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
    } else {
        $wp_rewrite->extra_permastructs['category'][0] = '%category%';
    }
}

/**
 * Adds our custom category rewrite rules.
 *
 * @param  array $category_rewrite Category rewrite rules.
 *
 * @return array
 */
function remove_category_url_rewrite_rules( $category_rewrite ) {
    global $wp_rewrite;

    $category_rewrite = array();

    /* WPML is present: temporary disable terms_clauses filter to get all categories for rewrite */
    if ( class_exists( 'Sitepress' ) ) {
        global $sitepress;

        remove_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) );
        $categories = get_categories( array( 'hide_empty' => false, '_icl_show_all_langs' => true ) );
        add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) );
    } else {
        $categories = get_categories( array( 'hide_empty' => false ) );
    }

    foreach ( $categories as $category ) {
        $category_nicename = $category->slug;
        if (  $category->parent == $category->cat_ID ) {
            $category->parent = 0;
        } elseif ( 0 != $category->parent ) {
            $category_nicename = get_category_parents(  $category->parent, false, '/', true  ) . $category_nicename;
        }
        $category_rewrite[ '(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite[ '(' . $category_nicename . ')/page/?([0-9]{1,})/?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite[ '(' . $category_nicename . ')/?$' ] = 'index.php?category_name=$matches[1]';
    }

    // Redirect support from Old Category Base
    $old_category_base = get_option( 'category_base' ) ? get_option( 'category_base' ) : 'category';
    $old_category_base = trim( $old_category_base, '/' );
    $category_rewrite[ $old_category_base . '/(.*)$' ] = 'index.php?category_redirect=$matches[1]';

    return $category_rewrite;
}

function remove_category_url_query_vars( $public_query_vars ) {
    $public_query_vars[] = 'category_redirect';

    return $public_query_vars;
}

/**
 * Handles category redirects.
 *
 * @param $query_vars Current query vars.
 *
 * @return array $query_vars, or void if category_redirect is present.
 */
function remove_category_url_request( $query_vars ) {
    if ( isset( $query_vars['category_redirect'] ) ) {
        $catlink = trailingslashit( get_option( 'home' ) ) . user_trailingslashit( $query_vars['category_redirect'], 'category' );
        status_header( 301 );
        header( "Location: $catlink" );
        exit;
    }

    return $query_vars;
}

function remove_category_url_plugin_row_meta( $links, $file ) {
        if( plugin_basename( __FILE__ ) === $file ) {
            $links[] = sprintf(
                '<a target="_blank" href="%s">%s</a>',
                esc_url('http://wordlab.com.br/donate/'),
                __( 'Donate', 'remove_category_url' )
            );
        }
        return $links;
    }
1
CK MacLeod

Placez ce code dans votre fichier functions.php et vous êtes prêt (même avec WordPress 4.7.2)

/* hooks */
register_activation_hook(__FILE__,    'yw_no_category_slug_refresh_rules');
register_deactivation_hook(__FILE__,  'yw_no_category_slug_deactivate');

/* actions */
add_action('created_category',  'yw_no_category_slug_refresh_rules');
add_action('delete_category',   'yw_no_category_slug_refresh_rules');
add_action('edited_category',   'yw_no_category_slug_refresh_rules');
add_action('init',              'yw_no_category_slug_permastruct');

/* filters */
add_filter('category_rewrite_rules', 'yw_no_category_slug_rewrite_rules');
add_filter('query_vars',             'yw_no_category_slug_query_vars');    // Adds 'category_redirect' query variable
add_filter('request',                'yw_no_category_slug_request');       // Redirects if 'category_redirect' is set

function yw_no_category_slug_refresh_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

function yw_no_category_slug_deactivate() {
    remove_filter( 'category_rewrite_rules', 'yw_no_category_slug_rewrite_rules' ); // We don't want to insert our custom rules again
    yw_no_category_slug_refresh_rules();
}

/**
 * Removes category base.
 *
 * @return void
 */
function yw_no_category_slug_permastruct()
{
    global $wp_rewrite;
    global $wp_version;

    if ( $wp_version >= 3.4 ) {
        $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
    } else {
        $wp_rewrite->extra_permastructs['category'][0] = '%category%';
    }
}

/**
 * Adds our custom category rewrite rules.
 *
 * @param  array $category_rewrite Category rewrite rules.
 *
 * @return array
 */
function yw_no_category_slug_rewrite_rules($category_rewrite) {
    global $wp_rewrite;
    $category_rewrite=array();

    /* WPML is present: temporary disable terms_clauses filter to get all categories for rewrite */
    if ( class_exists( 'Sitepress' ) ) {
        global $sitepress;

        remove_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) );
        $categories = get_categories( array( 'hide_empty' => false ) );
        //Fix provided by Albin here https://wordpress.org/support/topic/bug-with-wpml-2/#post-8362218
        //add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) );
        add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ), 10, 4 );
    } else {
        $categories = get_categories( array( 'hide_empty' => false ) );
    }

    foreach( $categories as $category ) {
        $category_nicename = $category->slug;

        if ( $category->parent == $category->cat_ID ) {
            $category->parent = 0;
        } elseif ( $category->parent != 0 ) {
            $category_nicename = get_category_parents( $category->parent, false, '/', true ) . $category_nicename;
        }

        $category_rewrite['('.$category_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite["({$category_nicename})/{$wp_rewrite->pagination_base}/?([0-9]{1,})/?$"] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite['('.$category_nicename.')/?$'] = 'index.php?category_name=$matches[1]';
    }

    // Redirect support from Old Category Base
    $old_category_base = get_option( 'category_base' ) ? get_option( 'category_base' ) : 'category';
    $old_category_base = trim( $old_category_base, '/' );
    $category_rewrite[$old_category_base.'/(.*)$'] = 'index.php?category_redirect=$matches[1]';

    return $category_rewrite;
}

function yw_no_category_slug_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}

/**
 * Handles category redirects.
 *
 * @param $query_vars Current query vars.
 *
 * @return array $query_vars, or void if category_redirect is present.
 */
function yw_no_category_slug_request($query_vars) {
    if( isset( $query_vars['category_redirect'] ) ) {
        $catlink = trailingslashit( get_option( 'home' ) ) . user_trailingslashit( $query_vars['category_redirect'], 'category' );
        status_header( 301 );
        header( "Location: $catlink" );
        exit();
    }

    return $query_vars;
}
0
YooWoo