Como criar um modelo para um URI personalizado associado ao usuário

4

Estou trabalhando em um site em que estou usando um plug-in chamado Postagens favoritas para que usuários conectados possam adicionar uma postagem (um tipo de postagem personalizada) para seus favoritos.

Eu criei uma página chamada my-favorites , que permite ao usuário logado ver as postagens que ele favoritou.

Agora, preciso criar uma página que permita que outro usuário ou visitante verifique os favoritos deste usuário.

Então, preciso ser capaz de fazer três coisas:

  1. Obtenha uma função relacionada ao autor que retorna um link como example.com/user/username que eu posso anexar a / favorites para obter o link - example.com/user/username/favorites ( the_author_link() e get_the_author() link parece vincular ao site e the_author_posts_url() produz a tag a com o nome. Qualquer função para obter a URL ou modificar autor para mostrar ao usuário?)

  2. Faça com que o WordPress use um modelo chamado favorites.php para exibir este página. (Se a estrutura combina, então como eu digo ao WordPress qual modelo usar?)

  3. Obtenha o ID do usuário para exibir seus favoritos para o visitante. No momento, eu uso o [favorite-post] shortcode no meu arquivo de modelo e pode passar um parâmetro chamado

    [favorite-post user_id = ""]
    

    Ele receberá automaticamente o ID do usuário se a página for ramificada do / author?

Eu encontrei este artigo mas ainda lida com tipos de postagem personalizados e query_vars que não estou usando. Como faço para que funcione na página de favoritos? A maioria das outras perguntas semelhantes feitas aqui foram resolvidas usando um slug para o tipo de postagem personalizada ou taxonomia.

    
por thedigitalmonk 31.01.2014 / 11:26

1 resposta

5

Primeiro de tudo, você tem uma função (tag template) para exibir o URL. Você pode escrever uma função personalizada que produza a url no formato desejado, no entanto, colocar o nome de usuário em uma URL pública pode ser um problema de segurança.

A função pode manipular o link e aceitar um argumento $user que pode ser um ID de usuário ou um objeto de usuário. Se non é passado, a função tentará usar o autor atual do post (se estiver no loop).

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

Agora você precisa fazer com que o WordPress entenda esse tipo de URL. Você tem que usar uma regra de reescrita para o propósito.

Você disse no OP que não está usando o query vars, mas deveria. O problema é que uma vez que você quer usar um permalink bonito, você tem que usar uma regra de reescrita, e qualquer parâmetro adicionado através de uma regra de reescrita só é acessível via query var e não via $_GET .

Então:

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

Depois de adicionar esse código, vá em seu back-end, visite a página " Configurações - > Permalinks " para liberar as regras de rewite.

Agora você tem um formato de URL, e quando você visitar esse URL, o WordPress definirá uma variável de consulta 'favoritos' preenchendo-a com o nome de usuário necessário.

No entanto, o WordPress não carregará a página "favoritos" quando chamarmos esse URL.

O que eu sugiro é que você crie um modelo de página personalizado e atribua a página "Meus favoritos" a ele.

Então crie um novo arquivo php, chame-o de 'page-favorites.php' , e dentro dele escreva apenas isto:

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

Nada mais.

Agora, no back-end, crie uma página (se você ainda não a tiver) e atribua a ela o modelo recém-criado.

Depois disso, podemos usar 'pre_get_posts' para consultar essa página quando o URL de favoritos do usuário for usado.

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

Com esse código, informamos ao WordPress para chamar a primeira página com o modelo 'page-favorites.php' quando o URL de favoritos for necessário.

A função user_favorites_get_user é uma função auxiliar usada para salvar o usuário requerido, evitando o uso de variáveis globais.

A função user_favorites_template força o WordPress a carregar 'favorites.php' como modelo.

Por dentro de 'favorites.php' , a parte relevante é a saída do código de acesso para as postagens favoritas dos usuários.

Existem 2 possibilidades: um usuário está logado e quer ver suas próprias postagens favoritas, ou alguém (logado ou não) quer ver as postagens favoritas por um usuário.

Isso pode ser traduzido em 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.';
}

Agora, quando um usuário está logado, ele pode visitar o url example.com/my-favorites (se 'meus-favoritos' for o slug da página atribuída ao modelo de página "Meus Favoritos") para ver o seu próprio posts.

Qualquer visitante registrado ou não registrado, pode usar um URL como example.com/user/username/favorites e visualizar a postagem de favoritos para esse usuário específico.

    
por gmazzap 31.01.2014 / 18:19