초안 게시물을 모든 사람이 액세스 할 수있게하려면 어떻게합니까?


13

Wordpress 웹 사이트에 게시되지 않은 게시물 이 여러 개 있는데 일반 게시물 슬러그 ( site.com/post-here)를 사용하여 로그인하지 않은 일반 사용자가 액세스 할 수 있도록하려고합니다 . 나는 그것이 최선의 방법이 아니라는 것을 이해하지만, 나의 특별한 목적을 위해서는 이것이 이루어져야한다.

functions.php파일에 다음 코드 스 니펫을 추가하려고했습니다 .

function enable_view_drafts() {
$role = get_role( 'subscriber' ); 
$role->add_cap( 'read_private_posts' ); 
$role->add_cap( 'edit_posts' );
}
add_action( 'after_setup_theme', 'enable_view_drafts');

나는 init대신 후크를 시도했다 after_setup_theme. 불운.

본인은 역할 변경 사항이 데이터베이스에 저장되므로 한 번만 수행하면된다는 것을 이해하고 있습니다. 그래서 after_setup_theme후크를 사용 하여 함수를 호출하는 이유 입니다.

그러나 일반 사용자로 페이지에 액세스하려고하면 게시물 내용을 표시하는 대신 404 페이지가 표시됩니다. 또한 미리보기 URL ( site.com/?p=212&preview=true)을 로드하려고 시도했지만 작동하지 않았습니다.

이것들은 내 추측입니다 :

  • 일반 사용자는 caps임시 게시물을 읽을 만큼 충분하지 않습니다 .
  • 프런트 엔드에서 임시 게시물을 테스트하고 보는 것은 모든 사용자 (관리자 포함)에게는 불가능합니다.

내가하려는 일을 달성하기 위해 어떤 변화를해야합니까? 가능하지 않은 경우 어떤 대체 솔루션을 제안 하시겠습니까?

참고 : 플러그인 기반 솔루션을 찾고 있지 않습니다.


2
여기에 약간의 혼란이 있다고 생각합니다. 로그인 하지 않은 사용자는 사용자가 아니므로 상한 이 없습니다 . 가입자 가 등록해야하고 로그인 가입자로 인식 할 수 있도록, 그래서 사용자입니다. 로그인하지 않은 사람에게는 기능을 제공 할 수 없습니다. 로그인하지 않은 사람이 게시물을 보도록하려면 게시 된 게시물과 전혀 다르지 않습니다. 그렇다면 왜 그것을 공개하지 않습니까? 또는 가입자 (구독자로 로그인)에게 초안을 표시 하시겠습니까?
gmazzap

@GM : 게시되지 않은 게시물을 게시물에 대한 직접적인 영구 링크를 알고있는 모든 사람이 액세스 할 수 있도록하려고합니다 . 이상한 요구 사항처럼 보일 수 있지만 프로젝트에는 이것이 필요합니다. 내 질문에서 언급했듯이 이것이 가능하지 않은 경우-다른 해결 방법을 제안 할 수 있습니까 (물론 알고있는 경우)?
Amal Murali

@GM : 플러그인을 알고 있습니까?
Amal Murali

3 개의 upvotes로 아래의 답변을 읽었습니까? 그것을 수행하는 방법을 설명하고 답변 끝에 github에서 전체 플러그인을 다운로드 할 수있는 링크가 있습니다.
gmazzap

2
후기 독자 : GitHub에서 사용 가능한 Dominik Schilling의 플러그인이 있습니다.
카이저

답변:


12

알 수없는 사용자에게는 기능을 할당 할 수 없습니다. 모든 사람이 게시물을 볼 수있게하려면 해당 게시물에 대해 별도의 URL을 만들고 게시물 편집기에 제어 요소를 추가하여 선택한 게시물에서만 미리보기를 활성화하십시오.
이러한 URL이 호출되면 게시물에 대한 미리보기가 허용되는지와 게시물이 아직 게시되지 않았는지 확인하십시오. 또한 검색 엔진이이 URL을 무시해야합니다.

URL의 경우 끝점을 사용 합니다 .

add_rewrite_endpoint( 'post-preview', EP_ROOT );

이제 다음과 같은 URL을 만들 수 있습니다.

http://example.com/post-preview/123

… 어디에 123게시물 ID가 없습니다.

그런 다음 콜백 핸들러를 사용하여 게시물 ID를 검사하고 유효한지 확인한 후 기본 쿼리를 덮어 씁니다. 아마도 유일하게 허용되는 유스 케이스입니다 query_posts(). :)

엔드 포인트가 클래스 T5_Endpoint(모델)이고 출력 핸들러가 T5_Render_Endpoint모델이 이전에 전달 된 클래스 (뷰) 라고 가정 해 봅시다 . 그렇다면 아마도 다음과 같은 메소드가 render()호출됩니다 template_redirect.

public function render()
{
    $post_id = $this->endpoint->get_value();

    if ( ! $post_id )
        return;

    if ( 1 !== $this->meta->get_value( $post_id )
        or 'publish' === get_post_status( $post_id )
        )
    {
        wp_redirect( get_permalink( $post_id ) );
        exit;
    }

    $query = array (
        'suppress_filters' => TRUE,
        'p'                => $post_id,
        'post_type'        => 'any'
    );

    query_posts( $query );

    add_action( 'wp_head', 'wp_no_robots' );
}

$this->metaT5_Post_Meta미리보기 허용 여부를 제어하는 ​​사후 메타 값에 대한 다른 모델 (class )입니다. 컨트롤은 게시 상자 ( actionpost_submitbox_misc_actions )에 설정되며 동일한 메타 클래스를 가져 오는 다른 뷰에 의해 렌더링됩니다.

스크린 샷

따라서 T5_Post_Meta메타 값을 저장할 위치와시기를 알고 있으면 뷰가 메타 값으로 무언가를 수행합니다.
또한 게시물이 게시 될 때 게시물 메타 필드를 삭제하기 위해 연결transition_post_status 합니다. 우리는 자원을 낭비하고 싶지 않습니다.

이것은 단지 개요입니다. 다룰 세부 사항이 많이 있습니다 ... 이것을 구현하는 방법을 보여주는 작은 플러그인을 작성했습니다 : T5 Public Preview .


정말 고맙습니다. 마침내 약간의 조정으로 목표를 달성했습니다. 대박. : D
Amal Murali

6

위의 @toscho의 답변보다 간단한 방법 으로이 문제를 해결했습니다.

내 유스 케이스는 내부 인트라넷 준비 사이트와 공개 사이트에 동일한 데이터베이스를 사용하고 있으며 워크 플로는 제작자가 초안을 작성하고 게시하기 전에 인트라넷 사이트에서 초안을 보는 다른 사용자와 공유하는 것입니다. 특히 검토자가 초안을보기 위해 로그인하도록 요구하지 않았기 때문에 ENV_PRODUCTION의 호스트 이름을 기반으로 wp-config 파일에 설정된 상수에 의존 하고 $_SERVER['SERVER_NAME']있습니다. 그것이 수표 ENV_PRODUCTION가하는 일입니다. 프로덕션 사이트를 보는 경우 이러한 필터를 모두 단락시킵니다.

WP_Query가 $ wp_query-> posts 배열에서 모든 게시물을 제거한 후에 연결해야하기 때문에 조금 이상하지만, 안정적이고 안전한 것처럼 보입니다.

/*
 * On staging site home and archives, drafts should be visible.
 */
function show_drafts_in_staging_archives( $query ) {
    if ( ENV_PRODUCTION )
        return;

    if ( is_admin() || is_feed() )
        return;

    $query->set( 'post_status', array( 'publish', 'draft' ) );
}

add_action( 'pre_get_posts', 'show_drafts_in_staging_archives' );


/*
 * Make drafts visible on staging site single views.
 *
 * (Because on single views, WP_Query goes through logic to make sure the 
 * current user can edit the post before displaying a draft.)
 */
function show_single_drafts_on_staging( $posts, $wp_query ) {
    if ( ENV_PRODUCTION )
        return $posts;

    //making sure the post is a preview to avoid showing published private posts
    if ( ! is_preview() )        
        return $posts;

    if ( count( $posts ) )
        return $posts;

    if ( !empty( $wp_query->query['p'] ) ) {
        return array ( get_post( $wp_query->query['p'] ) );
    }
}

add_filter( 'the_posts', 'show_single_drafts_on_staging', 10, 2 );

필터에는 별도의 두 부분이 있습니다.

  • "pre_get_posts"후크의 필터는 스테이징 사이트에서 기본 post_status를 'publish, draft'로 설정합니다. 그러면 아카이브 목록에 초안 게시물이 반환됩니다.
  • WP_Query 클래스에는 현재 cuser가 편집 할 수있는 경우가 아니라면 쿼리 결과에서 초안 게시물을 제거하기위한 불쾌한 논리가 있으므로 단일 뷰에는 별도의 필터가 필요합니다. 'the_posts'를 필터링하고 결과에 바로 게시하려는 게시물을 추가 하여이 문제를 해결했습니다.

2
이것은 믿어지지 않습니다. 이것을 공유해 주셔서 감사합니다. 절대적으로 완벽하고 내가 필요한 것.
Christian Varga

이 코드를 어디에 두어야합니까? (어떤 파일입니까?)
Joelio

@Joelio 해결하려는 문제에 대해 구체적으로 설명해 주시겠습니까? 간단한 접근 방식으로 방금이 코드를 functions.php에 추가하고 요청 도메인에 따라 ENV_PRODUCTION 상수를 true 또는 false로 설정하는 간단한 정의를 wp-config.php에 추가했습니다.
goldenapples

@goldenapples이 코드를 function.php에 추가했습니다. wp-config에 무엇을 추가해야합니까? 도움을 주셔서 감사합니다
Graham Slick

@MatthiasGrahamSlick- ENV_PRODUCTION프로덕션 환경 에서 상수 를 설정할 무언가가 필요합니다 . 프로덕션에 domain.com을 사용하고 준비에 staging.domain.com을 사용하고 있었으므로 내 라인이 define( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );도움이 되나요?
goldenapples

0

WordPress.org 웹 사이트에서 사용 가능한 "사용자 역할 편집기"플러그인이 원하는 것일 수 있습니다. 그런데 왜 모든 사람에게 초안에 액세스하고 싶습니까? 개인적으로 이것이 필요한 인스턴스는 생각할 수 없습니다.


아니요, 질문에서 언급했듯이 플러그인 기반 솔루션을 찾고 있지 않습니다. 유스 케이스는 약간 복잡하지만 이것이 달성하려는 이 특정 작업에 가장 적합한 솔루션이라고 확신합니다 . :-)
Amal Murali 1

나는 그 이유에 대해서도 당황했다. 모든 사람이 게시물을 볼 수 있도록하려면 왜 게시물을 게시하지 않습니까? 게시물에서 사용자 정의 필드를 사용하여 정의하려는 특수 상태를 추적 할 수 있습니다.
KenB

사용자가 콘텐츠를 볼 수 있도록하지만 특정 이유로 게시물을 게시하고 싶지 않습니다.
Amal Murali

0

공개 방문자, 검색 엔진, RSS 피드 등이 아닌 편집자 및 관리자 만 볼 수있는 "비공개"로 페이지 / 포스트의 가시성을 변경할 수 있습니다.


0

나는 GM의 의견이 여기에 가장 좋은 것이라고 생각합니다. 나는 당신이 다음을하려고한다고 가정합니다.

  1. 글쓰기
  2. 임시 보관함에 저장
  3. 외부 (로그인되지 않은) 사용자가 승인을 위해 초안을 볼 수 있도록 허용
  4. 게시

그 맞습니까?

불행히도, 나는 이것을하는 간단한 방법을 생각할 수 없습니다. 비밀번호를 입력하여 보려면 비공개 게시물로 게시 할 수 있지만 로그인해야합니다. 비밀번호로 보호 할 수도 있지만 피드와 최근 게시물 목록 등에 계속 표시됩니다. 게스트 사용자 계정을 생성하지 않고 URL을 제공 할 때 사용자 이름 / 암호를 제공 할 수 없습니까?

자세한 내용은 여기를 참조하십시오 : http://codex.wordpress.org/Content_Visibility

또는 귀하의 요구에 맞는 플러그인이 있습니다 : http://wordpress.org/extend/plugins/shareadraft/ 코드를 빠르게 살펴본 결과 개발자가 get_post_status에서 반환 한 값을 수정하는 것처럼 보입니다. 그걸로 놀 수 있습니다.

http://codex.wordpress.org/Function_Reference/get_post_status

HTH


0

게시물이 "게시"되었는지 여부에 상관없이 일반 게시 된 URL에서 누구나 액세스 할 수 있고 메인 페이지 / 검색 결과 / rss 피드 등에 표시되지 않도록하려면이 플러그인이 WP 4.6에서 작동했습니다. 1 게시물이 나타나는 위치를 미세 조정할 수 있습니다.

https://wordpress.org/plugins/wp-hide-post/

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