Cómo crear una plantilla para un URI personalizado asociado con el usuario

4

Estoy trabajando en un sitio donde estoy usando un complemento llamado Publicaciones favoritas para que los usuarios registrados puedan agregar una publicación (un tipo de publicación personalizada) a sus favoritos.

Creé una página llamada my-favorites que le permite al usuario que ha iniciado sesión ver las publicaciones que ha favorecido.

Ahora necesito crear una página que permita al otro usuario o visitante verificar los favoritos de este usuario.

Necesito poder hacer tres cosas:

  1. Obtenga una función relacionada con el autor que devuelve un enlace como example.com/user/username a los que puedo agregar / favoritos para obtener el enlace - example.com/user/username/favorites ( the_author_link() y get_the_author() link parece vincular al sitio web y the_author_posts_url() genera una etiqueta con el nombre. ¿Cualquier función para obtener la URL o tal vez modificar el autor para que muestre al usuario?)

  2. Haz que WordPress use una plantilla llamada favorites.php para mostrar esto página. (Si la estructura coincide, entonces ¿cómo le digo a WordPress qué plantilla usar?)

  3. Obtenga el ID de usuario del usuario para mostrar sus favoritos a el visitante. En este momento, uso el código corto [favorite-post] en mi plantilla de archivo y puede pasar un parámetro llamado

    [favorite-post user_id = ""]
    

    ¿Obtendrá automáticamente el ID de usuario si la página se ramifica desde / autor?

Encontré este artículo pero aún se trata de tipos de publicación personalizados y query_vars que no estoy usando. ¿Cómo hago para que funcione para la página de favoritos? La mayoría de las otras preguntas similares que se hicieron aquí se resolvieron utilizando un slug para el tipo de publicación personalizada o taxonomía.

    
pregunta thedigitalmonk 31.01.2014 - 11:26

1 respuesta

5

En primer lugar, necesita una función (etiqueta de plantilla) para mostrar la URL. Puede escribir una función personalizada que genere la url en el formato que desee, sin embargo, colocar el nombre de usuario en una url pública puede ser un problema de seguridad.

La función puede manejar el enlace y aceptar un argumento $user que puede ser un ID de usuario o un objeto de usuario. Si no se pasa, la función intentará usar el autor de la publicación actual (si está en el bucle).

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' );
  }
}

Ahora tienes que hacer que WordPress entienda este tipo de urls. Tienes que usar una regla de reescritura para este propósito.

Usted dijo en OP que no está utilizando las variables de consulta, pero debería hacerlo. El problema es que una vez que quieras usar un enlace permanente bonito, debes usar una regla de reescritura, y cualquier parámetro agregado a través de una regla de reescritura solo es accesible a través de la consulta var y no a través de $_GET .

Entonces:

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' );

Después de agregar este código, ingresa a tu backend, visita la página " Configuración - > Permalinks " para eliminar las reglas de rewite.

Ahora tiene un formato de URL, y cuando visite esa URL, WordPress establecerá una variable de consulta 'favoritos' rellenándola con el nombre de usuario requerido.

Sin embargo, no cargaremos WordPress en la página de 'favoritos' cuando llamemos a esa URL.

Lo que te sugiero es crear una plantilla de página personalizada y asignarle la página "Mis favoritos".

Así que crea un nuevo archivo php, llámalo 'page-favorites.php' , y dentro de él escribe solo esto:

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

Nada más.

Ahora, en el backend, crea una página (si aún no la tienes) y asigna la plantilla que acabas de crear.

Después de eso, podemos usar 'pre_get_posts' para consultar esta página cuando se usa la url de favoritos del usuario.

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';
}

Con este código, le pedimos a WordPress que llame a la primera página con la plantilla 'page-favorites.php' cuando se requiere la URL de favoritos.

La función user_favorites_get_user es una función auxiliar que utilizamos para guardar el usuario requerido, evitando el uso de variables globales.

La función user_favorites_template hace que WordPress cargue 'favorites.php' como plantilla.

Dentro de 'favorites.php' , la parte relevante es generar el código corto para las publicaciones favoritas de los usuarios.

Hay 2 posibilidades: un usuario se registra y desea ver sus propias publicaciones favoritas, o alguien (con o sin sesión) desea ver las publicaciones favoritas de un usuario.

Eso se puede traducir en un código como este:

//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.';
}

Ahora, cuando un usuario ha iniciado sesión, él / ella puede visitar la url example.com/my-favorites (si 'my-favorites' es la barra de la página asignada a la plantilla de la página "My Favorites") para ver su propia publicaciones.

Cualquier visitante registrado o no registrado, puede usar una URL como example.com/user/username/favorites y ver las publicaciones favoritas de ese usuario específico.

    
respondido por el gmazzap 31.01.2014 - 18:19

Lea otras preguntas en las etiquetas