Como tornar a pré-visualização da publicação agendada visível para qualquer pessoa?

2

Quando escrevo uma postagem e a agende para publicação posterior, o WordPress permite que eu visualize a postagem como se já estivesse publicada, mas preciso estar logado como administrador (ou qualquer pessoa que tenha autorização para visualizar a postagem).

Existe uma maneira, possivelmente um parâmetro de string de consulta, para tornar a postagem pré-visualizável por qualquer pessoa, ou seja, também por usuários anônimos? Algo como my-post?previewsecret=645732116468 ?

    
por Borek Bernard 18.03.2012 / 23:24

2 respostas

7

Pré-visualizações de rascunho

Dê uma olhada rápida neste pedaço do código principal em query.php que

  

[Verifica] status da postagem para determinar se a postagem deve ser exibida.

enlace

if ( ! is_user_logged_in() ) {
  // User must be logged in to view unpublished posts.
  $this->posts = array();
}

... é o que faz com que não seja fácil ignorar usuários não logados. Você pode substituir o resultado dessa função indo mais profundo e depois cuidando dos papéis. Mas isso é muita sobrecarga e pode contribuir para a segurança exposta.

Se você olhar um pouco mais para frente enlace na linha 2632, você verá que a postagem foi realmente extraída do banco de dados e pode ser filtrada usando o gancho posts_results que vem com algumas linhas abaixo.

Armazene o valor do post e injete-o no final após todas as verificações que anulam o array posts . enlace onde the_posts hook aguarda ansiosamente.

Então, algo áspero seria parecido com:

add_filter( 'posts_results', 'wpse46014_peek_into_private', null, 2 );
function wpse46014_peek_into_private( $posts, &$query ) {

    if ( sizeof( $posts ) != 1 ) return $posts; /* not interested */

    $status = get_post_status( $posts[0] );
    $post_status_obj = get_post_status_object( $status );

    if ( $post_status_obj->public ) return $posts; /* it's public */

    if ( !isset( $_GET['key'] ) || $_GET['key'] != 'foryoureyesonly' )
        return $posts; /* not for your eyes */

    $query->_my_private_stash = $posts; /* stash away */

    add_filter( 'the_posts', 'wpse46014_inject_private', null, 2 );
}

function wpse46014_inject_private( $posts, &$query ) {
    /* do only once */
    remove_filter( 'the_posts', 'wpse46014_inject_private', null, 2 );
    return $query->_my_private_stash;
}

Anexe seu link de pré-visualização da postagem com a chave secreta ?p=4601&key=foryoureyesonly e a postagem será exibida para qualquer pessoa. O código tem algumas coisas sujas, como o stash, você pode usar globals (não recomendado) ou envolvê-lo em um objeto (sim!) E estender ainda mais a funcionalidade com senhas personalizadas para cada postagem, etc.

Pré-visualizações agendadas

As visualizações agendadas funcionam de maneira muito semelhante. Os posts_results são preenchidos com 'future' status posts da mesma maneira e os mesmos ganchos podem ser aproveitados. O código funcionará sem alterações para postagens agendadas.

/2012/07/12/one-two-three/ - 404 NOT FOUND

/2012/07/12/one-two-three/?key=foryoureyesonly - 200 OK

    
por soulseekah 19.03.2012 / 13:24
1

A resposta de Soulseekah é incrível, e a coisa exata que eu estava procurando. Na busca por isso, eu também encontrei um plugin (que pode ser baseado neste post por tudo que eu sei).

Pré-visualização da postagem pública

    
por hookedonwinter 28.02.2013 / 19:27