web-dev-qa-db-fra.com

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

Je travaille sur un site où j'utilise un plugin appelé Posts favoris afin que les utilisateurs connectés puissent ajouter un message (un type de message personnalisé) à leur profil. favoris.

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

Maintenant, je dois créer une page qui permette à un autre utilisateur ou visiteur de vérifier 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 que je peux ajouter à/favourites pour obtenir le lien - example.com/user/username/favorites (the_author_link() et get_the_author() le lien semble se lier au site Web et the_author_posts_url() affiche le tag avec le nom. N'importe quelle fonction juste obtenir l'URL ou peut-être modifier l'auteur pour afficher l'utilisateur à la place?)

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

  3. Obtenez l'identifiant de l'utilisateur pour montrer ses favoris au visiteur. À l’heure actuelle, j’utilise le shortcode [favorite-post] dans mon fichier de modèle et peux transmettre un paramètre appelé

    [favorite-post user_id = ""]
    

    Obtiendra-t-il automatiquement l'ID utilisateur si la page est dérivée de/author?

J'ai trouvé cet article mais il traite toujours des types de publication 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 en utilisant un slug pour le type de message personnalisé ou la taxonomie.

4
thedigitalmonk

Tout d’abord, vous avez besoin d’une fonction (balise template) pour afficher l’URL. Vous pouvez écrire une fonction personnalisée qui affiche 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 de la publication actuelle (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 query var et non via $_GET.

Alors:

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, nous ne chargerons pas WordPress dans la page "Favoris" lorsque nous appellerons 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 seulement 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.

Après cela, 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 le fichier "favorites.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 messages favoris, ou quelqu'un (connecté ou non) veut voir les messages favorisés par 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 'my-favourites' est le slug de la page affectée au modèle de page "Mes favoris") pour voir ses propres 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.

5
gmazzap