이 형식과 같은 친숙한 URL로 공개 프런트 엔드 프로필 페이지를 만들고 싶습니다.
mysite.com/user/someusername
어떻게 이것을 달성 할 수 있습니까? 다시 쓰기 규칙과 관련이 있다는 것을 알고 있지만 어떻게 할 수 있는지 전혀 모릅니다. 나에게 링크 나 튜토리얼이 있다면 좋을 것입니다.
감사!
답변
이 작업을 수행 한 것을 발견 한 두 가지 방법이 있습니다.
- 사용자 지정 다시 쓰기 규칙이있는 작성자 페이지
- 다시 쓰기 규칙과 쌍을 이루는 사용자 정의 템플릿 파일
첫 번째는 구현하기가 더 간단하지만 모든 상황에서 작동하지 않을 수 있습니다 (이 중 하나는 곧 설명하겠습니다).
사용자 정의 다시 쓰기 규칙
며칠 전에이 솔루션을 찾았습니다. URL 재 작성
다음은 주석이 포함 된 코드입니다.
// Define the author levels you want to use
$custom_author_levels = array( 'user', 'leader' );
// On init, add a new author_level rewrite tag and add it to the author_base property of wp_rewrite
add_action( 'init', 'wpleet_init' );
function wpleet_init()
{
global $wp_rewrite;
$author_levels = $GLOBALS['custom_author_levels'];
// Define the tag and use it in the rewrite rule
add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
$wp_rewrite->author_base = '%author_level%';
}
// The previous function creates extra author_name rewrite rules that are unnecessary.
//This function tests for and removes them
add_filter( 'author_rewrite_rules', 'wpleet_author_rewrite_rules' );
function wpleet_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;
}
그런 다음 내장 된 author.php 템플릿을 사용하여 하트 컨텐츠를 수정할 수 있습니다.
Jan Fabry가 모든 것을 설명하는 훌륭한 작업을 수행하므로 위에 나열된 링크를 확인하십시오.
쿼리 변수 및 페이지 템플릿
이러한 솔루션을 검색하는 동안 작업 한 테마의 경우 사용자 메타 값 (별도의 ID)을 기반으로 사용자 정의 페이지를 제공해야했습니다. 내 고객은 사용자 이름 또는 사용자 ID를 공개적으로 표시하지 않기 위해 별도의 계층을 만들었습니다.
유일한 문제? 현재 Rewrite API를 사용하여 메타 키 / 값으로 쿼리하는 방법은 명확하지 않습니다. 운 좋게도 해결책이있었습니다.
functions.php 파일에서 …
// Create the query var so that WP catches your custom /user/username url
add_filter( 'query_vars', 'wpleet_rewrite_add_var' );
function wpleet_rewrite_add_var( $vars )
{
$vars[] = 'user';
return $vars;
}
그런 다음 새 쿼리 var를 처리하는시기와 방법을 알 수 있도록 새 다시 쓰기 태그와 규칙을 만들어야합니다.
add_rewrite_tag( '%user%', '([^&]+)' );
add_rewrite_rule(
'^user/([^/]*)/?',
'index.php?user=$matches[1]',
'top'
);
이 작업을 완료하면 검색어 var가 제공 될 때 “캐치”한 다음 선택한 템플릿으로 리디렉션하면됩니다.
add_action( 'template_redirect', 'wpleet_rewrite_catch' );
function wpleet_rewrite_catch()
{
global $wp_query;
if ( array_key_exists( 'user', $wp_query->query_vars ) ) {
include (TEMPLATEPATH . '/user-profile.php');
exit;
}
}
user-profile.php를 작성했는지 확인하십시오.
내 예제에서는 $ wpdb-> usermeta 테이블을 통해 “public user ID”를 실제 user_id와 일치시키는 세 번째 함수를 만들고 정보를 템플릿에 전달했습니다.
나머지 테마와 다른 템플리트를 작성해야하는 경우 get_header를 사용하여 이름을 지정할 수 있습니다.
get_header( 'user' );
header-user.php 파일을 호출합니다.
결론
둘 다 유효하고 작동하는 솔루션입니다. 두 번째는 다른 사용자가 프로파일을 찾아 볼 수있는 경우 사용자 ID 또는 사용자 이름을 표시하지 않으므로 별도의 “보안”계층을 제공합니다.
도움이 되길 바랍니다. 궁금한 점이 있으면 알려주세요.
답변
나는 오늘 일찍 이것을 발견하고 template_redirect를 사용하는 대신 정적 페이지를 표시하도록 요청을 변경한다는 점에서 @bybloggers 코드를 약간 수정했습니다. 즉, 원하는 것을 페이지 템플릿에 추가하고 사용할 수 있습니다. 페이지.
class ProfilePage {
function __construct() {
add_filter( 'init',array($this,'rw_init'));
add_filter( 'query_vars', array($this,'wpleet_rewrite_add_var') );
add_filter( 'request', array($this,'change_requests'));
}
function wpleet_rewrite_add_var( $vars ) {
$vars[] = 'usuario';
return $vars;
}
function rw_init(){
add_rewrite_tag( '%usuario%', '([^&]+)' );
add_rewrite_rule(
'^usuario/([^/]*)/?',
'index.php?usuario=$matches[1]',
'top'
);
}
function change_requests($query_vars) {
//go to a specific page when the usuario key is set
$query_vars['page_id'] = isset($query_vars['usuario']) ? 7581 : $query_vars['page_id'];
return $query_vars;
}
}
new ProfilePage();
스페인어-> usuario = user <-영어
답변
이것은 @bybloggers 답변 (고마워)을 기반으로 한 작업 코드입니다. 우리는 template_redirect 후크를 사용하지 말고 PHP를 종료해서는 안된다는 것을 알게되었습니다.
설명은 여기에 있습니다 : https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/
따라서 template_include 후크를 사용해야합니다. 이 후크를 사용하면 redirect 및 exit 메소드를 사용할 필요가 없습니다.
그리고 다른 차이점은 / userid없이 www.server.com/myaccount가 필요하다는 것입니다.
이것은 코드입니다.
add_filter( 'query_vars', 'wp58683_userprofile_var' );
function wp58683_userprofile_var( $vars )
{
$vars[] = 'myprofile';
return $vars;
}
add_rewrite_tag( '%myprofile%', '([^&]+)' );
add_rewrite_rule(
'^myprofile/?',
'index.php?myprofile',
'top'
);
add_action( 'template_include', 'wp58683_userprofile_page' );
function wp58683_userprofile_page($original_template)
{
global $wp_query;
if ( array_key_exists( 'myprofile', $wp_query->query_vars ) ) {
if (is_user_logged_in() ){
return TEMPLATEPATH . '/user-profile.php';
}
}
else {
return $original_template;
}
}
답변
또 다른 방법은 플러그인에 관심이없는 더 많은 기능이 있더라도이 내장 기능이있는 Buddypress를 사용하는 것입니다.