Support » Algemene WordPress vragen » HOE: 'Onze mensen' tonen met behulp van profile, slugs, etc.

  • OpgelostModerator Ruben Woudsma

    (@rubenw)


    Momenteel bezig met een project waarin ik diverse weergaven van personeelsleden wil laten tonen op de website van het bedrijf. Eigenlijk een ‘Onze mensen’.

    Wat zijn volgens jullie hiervoor de beste oplossingen? Zelf dacht ik aan:

    • Profiel van de gebruikers uitbreiden en kunnen groeperen;
    • CPT aanmaken voor deze groepen mensen.

    Zijn er nog andere oplossingen mogelijk naar jullie idee? Doelstelling is het volgende:

    “Alle medewerkers kunnen tonen en deze ook per afdeling/groep kunnen laten weergeven voor het bedrijf”.

    Mijn eerste gedachte is om het op te lossen door diverse velden aan het profiel toe te voegen, echter zat ik met enkele uitdagingen:

    1. Slug van de ‘author’ aanpassen in ‘onze-mensen’;
    2. Profielen kunnen groeperen (bv. admin, staff) en dit ook verwerken in de ‘slug’
    3. Groeppagina’s maken voor de diverse groepen

    Als URL’s voor de profielen krijg je dan:
    http://domeinnaam.nl/onze-mensen/staff/ruben-woudsma

    Benieuwd of jullie dit al eens gerealiseerd hebben. In het verleden de profielen van gebruikers al eens uitgebreid met extra informatie, maar groepen maken, slugs wijzigen en specifieke pagina’s, etc nog niet.

9 reacties aan het bekijken - 1 tot 9 (van in totaal 9)
  • Edit Flow heeft een “user groups” feature, het moet wel mogelijk zijn denk ik om de user group waartoe een user behoort in de permalink van z’n auteursarchief te krijgen. Author prefix veranderen naar e.g. onze-mensen is makkelijk, cf. Google, en voor de groeppagina’s kan je WP_User_Query gebruiken.

    Bedankt voor je reactie, maar ben met name nog op zoek hoe ik het ‘smoelenboek’ het beste kan oplossen. Ik hinkel nog op de twee hierboven genoemde punten.

    Enerzijds lijkt mij de ‘author/profile’ optie het mooist, echter zitten daar enkele technische beperkingen aan, te denken aan:

    • Aanpassen author base slug naar ‘onze-mensen’;
    • Aanpassen author nice_name slug naar ‘voornaam-achternaam’;
    • Toevoegen groep/categorienaam aan de author base slug.

    Voordelen zijn wel dat de mensen ook direct toegang hebben tot de website en ook berichten kunnen plaatsen.

    Anderzijds kan je kiezen voor CPT’s. Voordeel hiervan is dat je volledige redactionele controle hebt over de ‘slug’ en ook over de layout van de pagina’s. Nadeel echter vind ik dat de CPT’s in dit geval teveel op posts/pagina’s lijken en dit gericht is op inhoud/berichten en niet op persoon met velden/atributen.

    Enig idee hoe de items/uitdagingen hierboven te verhelpen bij de oplossing voor de author/profile oplossing?

    Ik denk dat dit antwoord op WPSE de nodige info bevat om te realiseren wat je wil. In het eerste stukje code kan je “onze-mensen” + de groep toevoegen aan de author base ($wp_rewrite->author_base = 'onze-mensen/%author_level%';), in het derde stukje code zal je zelf wat moeten knutselen en de author_level (opgeslagen in user meta) checken op basis van de $author_id. Voornaam-achternaam ipv nice_name zal ook moeten gebeuren tijdens het filteren van de author_link, check bv. dit antwoord voor inspiratie.

    Dank voor je reactie. Zelf zat ik nog naar de code van de plugin ‘Display Name Author Permalink’ te kijken. Deze past immers alleen de ‘author_link’ middels een add_filter en replace van de username door de display name.

    Zal deze twee even naast elkaar leggen aangezien beide van toepassing zijn om dit te realiseren.

    Ben momenteel nog bezig met de oplossing hiervoor. Jan heeft uitstekend werk geleverd bij ‘WordPress Answer’ met zijn oplossingen en rewrite regels.

    @donutz: heb nu jou voorstel genomen en de twee voorbeelden samengevoegd in één uitwerking. De link aanpassing van de auteur gaat nu goed, echter levert de verwijzing naar de auteur archiefpagina een 404 op. Wellicht dat de ‘request’ hook niet voldoende werkt, zie de volgende code:

    // 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)
    $nlforums12042013__author_groups = array( 'staff', 'admin', 'support', 'nerds', 'overig' );
    
    /*
     * Init WordPress to add globals which can be used for the authors and levels of the authors.
     */
    add_action( 'init', 'nlforums12042013__init' );
    function nlforums12042013__init()
    {
        global $wp_rewrite;
        $author_groups = $GLOBALS['nlforums12042013__author_groups'];
    
        // Define the tag and use it in the rewrite rule
        add_rewrite_tag( '%author_group%', '(' . implode( '|', $author_groups ) . ')' );
        $wp_rewrite->author_base = '%author_group%';
    }
    
    /*
     * Hook into 'request' to modify the author request.
     * Change the way the lookup works (via nickname in stead of the slug)
     */
    add_filter( 'request', 'nlforums12042013_request' );
    function nlforums12042013_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', 'nlforums12042013__author_rewrite_rules' );
    function nlforums12042013__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;
    }
    
    add_filter( 'author_link', 'nlforums12042013__author_link', 10, 3 );
    function nlforums12042013__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;
    }

    Je hebt simpelweg de user ID nodig, dus pas je wpdb query aan als volgt:

    $author_id = $wpdb->get_var( "SELECT user_id FROM $wpdb->usermeta" );

    Je zal ook de nickname moeten formatten voor gebruik in URLs:

    $author_nickname = get_user_meta( $author_id, 'nickname', true );
        if ( $author_nickname ) {
            $link = str_replace( $author_nicename, sanitize_title_with_dashes( $author_nickname ), $link );
        }

    Wil je tenslotte “onze-mensen” in de author base, gebruik dan:

    $wp_rewrite->author_base = 'onze-mensen/%author_group%';

    Dit zou moeten werken!

    Ben er nog niet helemaal uit. Ondanks je suggesties hierboven levert een aanpassing hiervan nog steeds een ‘404’ op zodra ik op de link klik. Volgens mij gaat er toch nog iets fout bij de request.

    Wanneer ik vervolgens de link wijzig in ‘domain.tld/author/nicename’ werkt het wel.

    Heb in het verlengde hiervoor een vraag gesteld op WordPress Answers, zie:

    http://wordpress.stackexchange.com/questions/95824/how-to-modify-author-base-slug-with-groups-and-slug-to-use-nice-nickname

    Vreemd, bij mij werkt je code (met mijn aanpassingen) op een clean install. Heb je permalinks admin page even bezocht om de rewrite rules te flushen?

    Ik heb even verder getest, en je hebt gelijk, het werkte niet naar behoren. Het onderstaande lijkt het wel te doen, heb het ook ff gepost op wpse 😉

    $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 ) );
9 reacties aan het bekijken - 1 tot 9 (van in totaal 9)
  • Het onderwerp ‘HOE: 'Onze mensen' tonen met behulp van profile, slugs, etc.’ is gesloten voor nieuwe reacties.