web-dev-qa-db-fra.com

Comment modifier slug base de l'auteur avec des groupes et slug pour utiliser Nice_nickname?

Après avoir lu les suggestions suivantes de Jan Fabry concernant la réécriture d'URL et l'auteur slug, j'ai relevé le défi de combiner les deux solutions en une.

But: Le but de ceci est d'avoir une structure pour les auteurs comme suit:

http://domain.tld/employees/(department|group)/firstname-lastname

Solution actuelle: Afin d’arranger cela, j’ai fusionné les solutions comme indiqué dans les réponses mentionnées comme suit:

// NOTE: This need to be stored different and need to be attached to author/profile
//       Will be added to user settings so this can be changed (only primary group will be stored)
$wpa04142013_author_groups = array( 'staff', 'admin', 'support', 'itnerds', 'etc' );

/*
 * Init WordPress to add globals which can be used for the authors and levels of the authors.
 */
add_action( 'init', 'wpa04142013_init' );
function wpa04142013_init()
{
    global $wp_rewrite;
    $author_groups = $GLOBALS['wpa04142013_author_groups'];

    // Define the tag and use it in the rewrite rule
    add_rewrite_tag( '%author_group%', '(' . implode( '|', $author_groups ) . ')' );
    $wp_rewrite->author_base = 'employees/%author_group%';
}

La solution ci-dessus s'assurera que le author_base est modifié selon les besoins en fonction de l'objectif défini au début. Après cela, le author_link doit être connecté à un autre pour utiliser le lien correct vers la page d'archive de l'auteur.

add_filter( 'author_link', 'wpa04142013_author_link', 10, 3 );
function wpa04142013_author_link( $link, $author_id, $author_nicename )
{
    //NOTE: This if/else needs to be changed --> either select case and use
    //      global defined groups based upon user property
    if ( 1 == $author_id ) {
        $author_group = 'staff';
    } else {
        $author_group = 'admin';
    }
    $link = str_replace( '%author_group%', $author_group, $link );

    //Below solution added from other WordPress Answers suggestion
        $author_nickname = get_user_meta( $author_id, 'nickname', true );
    if ( $author_nickname ) {
        $link = str_replace( $author_nicename, $author_nickname, $link );
    }

    return $link;
}

Après l’implémentation ci-dessus, le lien avec l’auteur fonctionne correctement, mais la demande et la réécriture d’URL ne fonctionnent pas. En cliquant sur le lien de l'auteur, vous obtiendrez une page 404 pour le modèle.

Si je ne me trompe pas, j'ai également besoin de modifier la section suivante, mais c'est là que ça ne va pas.

/*
 * Hook into 'request' to modify the author request.
 * Change the way the lookup works (via nickname in stead of the slug)
 */
add_filter( 'request', 'wpa04142013_request' );
function wpa04142013_request( $query_vars )
{
    if ( array_key_exists( 'author_name', $query_vars ) ) {
        global $wpdb;
        $author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $query_vars['author_name'] ) );
        if ( $author_id ) {
            $query_vars['author'] = $author_id;
            unset( $query_vars['author_name'] );   
        }
    }
    return $query_vars;
}

add_filter( 'author_rewrite_rules', 'wpa04142013_author_rewrite_rules' );
function wpa04142013_author_rewrite_rules( $author_rewrite_rules )
{
    foreach ( $author_rewrite_rules as $pattern => $substitution ) {
        if ( FALSE === strpos( $substitution, 'author_name' ) ) {
            unset( $author_rewrite_rules[$pattern] );
        }
    }
    return $author_rewrite_rules;
}

J'ai déjà reçu de l'aide sur le forum d'assistance hollandais de WordPress , mais je suis toujours coincé dans la recherche de la bonne solution. A également examiné les réécritures avec l'analyseur de réécriture, mais n'a pas trouvé le author_group. J'espère que vous pourrez m'aider à me diriger dans la bonne direction.

4
Ruben Woudsma

Edit: la réponse précédente ne fonctionne pas. La solution suivante ne fournit pas de surnoms désinfectés, mais devrait faire l'affaire:

    $nn = urldecode($query_vars['author_name'] );
    $author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $nn ) );
2
diggy

J'ai fait quelques tests supplémentaires et suis arrivé à la conclusion suivante. Outre la réponse ci-dessus il est obligatoire de vider les liens permanents pour appliquer les modifications aux fonctions .php.

  1. Enregistrer les modifications dans le functions.php
  2. Options ouvertes -> liens permanents.

Pas besoin de sauvegarder les modifications, il suffit de visiter la page pour vider les permaliens. En outre, il est indispensable de vérifier les nouvelles règles de réécriture avec Rewrite Analyzer. Si les modifications ne sont pas disponibles, suivez les étapes ci-dessus pour vider les permaliens.

Rewrite rules regarding author base and page slug with groups

0
Ruben Woudsma