친숙한 퍼머 링크로 프런트 엔드 사용자 프로필을 만드는 방법


23

이 형식과 같은 친숙한 URL로 공개 프런트 엔드 프로필 페이지를 만들고 싶습니다.

mysite.com/user/someusername

어떻게 이것을 달성 할 수 있습니까? 다시 쓰기 규칙과 관련이 있다는 것을 알고 있지만 어떻게 할 수 있는지 전혀 모릅니다. 나에게 링크 나 튜토리얼이 있다면 좋을 것입니다.

감사!

답변:


15

이 작업을 수행 한 것을 발견 한 두 가지 방법이 있습니다.

  1. 사용자 지정 다시 쓰기 규칙이있는 작성자 페이지
  2. 다시 쓰기 규칙과 쌍을 이루는 사용자 정의 템플릿 파일

첫 번째는 구현하기가 더 간단하지만 모든 상황에서 작동하지 않을 수 있습니다 (이 중 하나는 곧 설명하겠습니다).

사용자 정의 다시 쓰기 규칙

며칠 전에이 솔루션을 찾았습니다. 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 또는 사용자 이름을 표시하지 않으므로 별도의 "보안"계층을 제공합니다.

도움이 되길 바랍니다. 궁금한 점이 있으면 알려주세요.


실제로 Query_var 메소드를 사용하여 해결했습니다. 감사!
tiltdown

1
@bybloggers이 게시물이 약간 오래되었다는 것을 알고 있지만 URL의 사용자 이름을 템플릿으로 전달하는 세 번째 기능을 공유 할 수 있다면 궁금하십니까?
Pat

@Pat이 시점에서 실제 함수가 내 코드의 어느 위치에 있는지 확실하지 않지만 (앞서 말했듯이) 형식은 wpleet_rewrite_catch () 함수를 매우 밀접하게 따릅니다. array_key_exists ( 'user') 대신 공개 사용자 ID를 테스트 한 다음 wp_usermeta 테이블에서 검색하여 해당 공개 ID와 연관된 사용자를 확인했습니다. 코드를 사용할 수없는 경우에도 알고리즘이 도움이되기를 바랍니다.
bybloggers

2

나는 오늘 일찍 이것을 발견하고 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 <-영어


아주 좋아요! 공유해 주셔서 감사합니다. 더 동적으로 만들고 싶습니다.를 사용하여 ID를 전환 할 수 있습니다 get_page_by_path('page-slug')->ID. 또한 사용을 잊지 말고 다음 flush_rewrite_rules과 같이 추가하십시오.add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro

1

이것은 @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;
    }

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.