Comment créer un modèle pour un URI personnalisé associé à l'utilisateur

4

Je travaille sur un site sur lequel j'utilise un plugin appelé Posts favoris . Les utilisateurs ainsi connectés peuvent ajouter des informations. poste (type de publication personnalisé) dans leurs favoris.

J'ai créé une page appelée my-favorites qui permet à l'utilisateur connecté de voir les publications qu'il a ajoutées.

Je dois maintenant créer une page permettant à un autre utilisateur ou visiteur de consulter les favoris de cet utilisateur.

Je dois donc pouvoir faire trois choses:

  1. Obtenir une fonction liée à l'auteur qui renvoie un lien comme example.com/user/username auquel je peux ajouter / favoris pour obtenir le lien - example.com/user/username/favorites ( the_author_link() et get_the_author() le lien semble créer un lien vers le site Web et the_author_posts_url() renvoie le tag avec le nom. N'importe quelle fonction pour obtenir simplement l'URL ou peut-être modifier l'auteur pour afficher l'utilisateur à la place?)

  2. Amener WordPress à utiliser un modèle appelé favorites.php pour l’afficher page. (Si la structure correspond, comment puis-je indiquer à WordPress quel modèle utiliser?)

  3. Obtenir l'identifiant de l'utilisateur afin d'afficher ses favoris sur le visiteur. En ce moment, j’utilise le shortcode [favorite-post] dans mon fichier modèle et peut transmettre un paramètre appelé

    [favorite-post user_id = ""]
    

    L'identifiant de l'utilisateur sera-t-il automatiquement obtenu si la page est dérivée de / author?

J'ai trouvé cet article . mais il traite toujours des types d'articles personnalisés et de query_vars que je n'utilise pas. Comment puis-je le faire fonctionner pour la page de favoris? La plupart des autres questions similaires posées ici ont été résolues à l'aide d'un slug pour le type de message personnalisé ou la taxonomie.

    
posée thedigitalmonk 31.01.2014 - 11:26

1 réponse

5

Tout d’abord, vous avez besoin d’une fonction (balise template) pour afficher l’URL. Vous pouvez écrire une fonction personnalisée qui génère l'URL au format souhaité, mais placer le nom d'utilisateur dans une URL publique peut être un problème de sécurité.

La fonction peut gérer le lien et accepter un argument $user qui peut être un ID utilisateur ou un objet utilisateur. Si non est passé, la fonction essaiera d'utiliser l'auteur du post en cours (si elle est dans la boucle).

function get_user_favorites_url( $user = NULL ) {
  if ( is_int($user) ) $user = new WP_User( $user );
  if ( ! $user instanceof WP_User ) $user = get_the_author();
  if ( $user instanceof WP_User && $user->exists() ) {
    return home_url( 'user/' . $user->user_login . '/favorites' );
  }
}

Vous devez maintenant faire comprendre à WordPress ce type d’URL. Vous devez utiliser une règle de réécriture à cette fin.

Vous avez dit dans OP que vous n’utilisez pas de vars de requête, mais vous devriez le faire. Le problème est qu’une fois que vous voulez utiliser un joli permalien, vous devez utiliser une règle de réécriture, et tout paramètre ajouté via une règle de réécriture est uniquement accessible via la requête var et non via $_GET .

Donc:

function user_favorites_rule() {
    add_rewrite_rule( 'user/([^/]+)/favorites', 'index.php?favorites=$matches[1]', 'top' );
}
add_action( 'init', 'user_favorites_rule', 1 );

function user_favorites_var( $vars ) {
    $vars[] = 'favorites';
    return $vars;
}
add_filter( 'query_vars', 'user_favorites_var' );

Après avoir ajouté ce code, allez dans votre backend, visitez la page " Paramètres - > Permaliens " pour vider les règles de réwite.

Maintenant, vous avez un format d'URL, et lorsque vous visitez cette URL, WordPress définira une variable de requête 'favoris' la remplissant avec le nom d'utilisateur requis.

Cependant, WordPress ne charge pas la page "Favoris" lorsque nous appelons cette URL.

Je vous suggère de créer un modèle de page personnalisé et de lui attribuer la page "Mes favoris".

Créez donc un nouveau fichier php, nommez-le 'page-favorites.php' et écrivez-y uniquement ceci:

<?php
/*
Template Name: My Favorites
*/
require( 'favorites.php' );

Rien d'autre.

Maintenant, dans le backend, créez une page (si vous ne l'avez pas déjà) et attribuez-lui le modèle que vous venez de créer.

Ensuite, nous pouvons utiliser 'pre_get_posts' pour interroger cette page lorsque l'URL des favoris de l'utilisateur est utilisée.

function user_favorites_noquery( $query ) {
  if ( is_admin() || ! $query->is_main_query() || ! $query->is_home() ) return;
  $user = $query->get('favorites');
  if ( ! empty($user) ) {
    $mq = array(
      'meta_key' => '_wp_page_template', 'meta_value' => 'page-favorites.php'
    );
    $query->set( 'post_type', 'page' );
    $query->set( 'meta_query', array($mq) );           
    $query->set( 'posts_per_page', 1);
    $query->query['favorites'] = NULL;
    $query->query_vars['favorites'] = NULL;
    user_favorites_get_user( $user );
    add_filter( 'template_include', 'user_favorites_template', 9999 );
    // following line is to prevent WordPress redirect to the page standard url
    remove_filter('template_redirect', 'redirect_canonical');
  }
}
add_action( 'pre_get_posts', 'user_favorites_noquery' );

function user_favorites_get_user( $user = NULL ) {
  static $the_user = NULL;
  if ( ! empty($user)  ) $the_user = $user;
  return $the_user;
}

function user_favorites_template() {
  return get_template_directory() . '/favorites.php';
}

Avec ce code, nous demandons à WordPress d’appeler la première page avec le modèle 'page-favorites.php' lorsque l’URL des favoris est requise.

La fonction user_favorites_get_user est une fonction d'assistance que nous utilisons pour enregistrer l'utilisateur requis, en évitant l'utilisation de variables globales.

La fonction user_favorites_template force WordPress à charger 'favoris.php' en tant que modèle.

Dans 'favorites.php' , la partie pertinente consiste à sortir le code court pour les publications favorites des utilisateurs.

Il y a 2 possibilités: un utilisateur est connecté et veut voir ses propres publications favorites ou quelqu'un (connecté ou non) souhaite voir les publications favorites d'un utilisateur.

Cela peut être traduit dans un code comme celui-ci:

//favorites.php

$user_required = user_favorites_get_user();
$user = FALSE;
if ( ! empty($user_required ) ) {
  $user = get_user_by( 'login', $user_required );
} elseif ( is_user_logged_in() ) {
  $user = wp_get_current_user();
}
if ( $user instanceof WP_User && $user->exists() ) {
  echo do_shortcode( '[favorite-post user_id = "' . $user->ID . '"]' );
} else {
  echo 'No user selected.';
}

Désormais, lorsqu'un utilisateur est connecté, il peut consulter l'URL example.com/my-favorites (si "mes favoris" est le slug de la page affectée au modèle de page "Mes favoris") pour afficher son propre fichier. messages.

Tout visiteur connecté ou non connecté peut utiliser une URL telle que example.com/user/username/favorites et consulter la publication des favoris pour cet utilisateur spécifique.

    
réponse donnée gmazzap 31.01.2014 - 18:19

Lire d'autres questions sur les étiquettes