Como faço uma postagem de rascunho acessível a todos?

12

Eu tenho várias postagens não publicadas no meu site Wordpress e estou tentando torná-lo acessível para usuários normais (que não estão logados) usando os slugs normais de postagem ( site.com/post-here ). Eu entendo que pode não ser a melhor prática, mas para meu propósito especial, isso precisa ser feito.

Eu tentei adicionar o seguinte snippet de código ao meu arquivo 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');

Eu também tentei init hook em vez de after_setup_theme . Sem sorte.

Meu entendimento é que as alterações nas funções são salvas no banco de dados, portanto, só precisam ser feitas uma vez. É por isso que estou usando after_setup_theme hook para chamar a função.

Mas quando eu tento acessar a página como um usuário normal, estou mostrando uma página 404 em vez de mostrar o conteúdo da postagem. Também tentei carregar o URL de visualização ( site.com/?p=212&preview=true ), mas isso também não funcionou.

Estas são minhas suposições:

  • o usuário normal não tem caps suficiente para ler a postagem de rascunhos.
  • teste e visualização de postagens de rascunho no front-end não é possível para nenhum usuário (incluindo administradores).

Que mudanças eu tenho que fazer para conseguir o que estou tentando fazer? Se não for possível, que soluções alternativas você sugere?

Observação: não estou procurando soluções baseadas em plug-in.

    
por Amal Murali 18.07.2013 / 22:14

6 respostas

12

Você não pode atribuir recursos a usuários desconhecidos. Se você quiser tornar uma postagem visível para todos, crie um URL separado para essas postagens e adicione um elemento de controle ao editor de postagem para ativar a visualização somente em publicações selecionadas.
Quando um URL desse tipo é chamado, verifique se uma visualização é permitida para a postagem e se a postagem ainda não foi publicada. Verifique também se os mecanismos de pesquisa ignoram esse URL.

Para o URL, usaria um ponto de extremidade :

add_rewrite_endpoint( 'post-preview', EP_ROOT );

Agora você pode criar URLs como…

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

… onde 123 é o ID do post.

Em seguida, use um manipulador de retorno de chamada para inspecionar o ID do post, verifique se ele é válido e sobrescreva a consulta principal. Este é provavelmente o único caso de uso aceitável para query_posts() . :)

Digamos que o endpoint é uma classe T5_Endpoint (um modelo) e o manipulador de saída é uma classe T5_Render_Endpoint (uma visualização) que recebe o modelo passado anteriormente. Então, provavelmente há um método render() chamado em 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->meta é outro modelo (classe T5_Post_Meta ) para o valor pós meta que controla se uma visualização é permitida. O controle é definido na caixa Publicar ( ação post_submitbox_misc_actions ), processada por outra visão que recebe a mesma meta-classe.

Portanto,T5_Post_Metasabeondeequandoarmazenarometavalor,asvisualizaçõesfazemalgocomele.
Alémdisso, conecte-se a transition_post_status para excluir o campo de meta-postagem quando a publicação for publicada. Nós não queremos desperdiçar recursos, certo?

Este é apenas um esboço. Há muitos detalhes para cobrir ... Eu escrevi um pequeno plugin que mostra como implementar isso: T5 Public Preview .

    
por fuxia 03.10.2013 / 19:05
5

Eu resolvi esse problema no que achei ser uma maneira mais simples do que a resposta de @ toscho acima.

Meu caso de uso é usar o mesmo banco de dados para um site interno de intranet e um site público, e o fluxo de trabalho é que os autores gravem rascunhos e os compartilhem com outros usuários que visualizam esses rascunhos no site da intranet, antes de publicar. Eu especificamente não queria exigir que os revisores fizessem login para ver rascunhos, portanto, estou apenas dependendo de uma constante, ENV_PRODUCTION , que é definida no arquivo wp-config com base no nome do host em $_SERVER['SERVER_NAME'] . Isso é o que as verificações de ENV_PRODUCTION estão fazendo; apenas abreviando todos esses filtros se o site de produção estiver sendo visualizado.

Isso é um pouco estranho, porque você precisa se conectar depois que WP_Query remove todas as postagens da matriz de postagens $ wp_query- & gt ;, mas parece estável e seguro para mim.

/*
 * 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 );

Existem duas partes separadas para os filtros.

  • Um filtro no gancho "pre_get_posts" define o post_status padrão para "publicar, rascunho" no site de teste. Isso retornará as mensagens de rascunho em listagens de arquivos.
  • É necessário um filtro separado para visualizações únicas, porque há uma lógica desagradável na classe WP_Query para remover as mensagens de rascunho dos resultados da consulta, a menos que o codificador atual possa editá-las. Eu superei isso filtrando 'the_posts', e adicionando o post que eu queria de volta aos resultados.
por goldenapples 10.10.2014 / 22:38
0

Acho que o plug-in "User Role Editor" disponível no site do WordPress.org pode ser o que você está procurando. By the way, por que você quer dar acesso aos seus rascunhos para todos? Eu pessoalmente não consigo pensar em uma instância em que isso seria necessário.

    
por Georgi Demirev 19.07.2013 / 03:27
0

Você pode alterar a visibilidade da página / postagem para "Particular", visível apenas para editores e administradores, e não para visitantes públicos, mecanismos de pesquisa, feeds RSS, etc.

    
por NickJAB 03.09.2013 / 00:09
0

Eu acho que o comentário do G.M. é o melhor aqui. Eu suponho que você está tentando fazer o seguinte:

  1. Escreva uma postagem
  2. Salvar como rascunho
  3. Permitir que um usuário externo (não conectado) visualize o rascunho para aprovação
  4. Publicar

Isso está correto?

Infelizmente, não consigo pensar em nenhuma maneira simples de fazer isso. Você poderia postá-lo como uma postagem privada para que eles precisem digitar uma senha para visualizá-la, mas você precisa estar logado para isso. Você também pode protegê-la com senha, mas ela ainda aparecerá em seu feed e na lista de postagens recentes, etc. Você não poderia criar uma conta de usuário convidada e dar a ela o nome de usuário / senha ao fornecer o URL?

Leia aqui para mais informações: enlace

Como alternativa, existe um plugin que pode atender às suas necessidades: enlace Eu dei uma rápida olhada no código e parece que o desenvolvedor está modificando o valor retornado por get_post_status para que você possa brincar com isso:

enlace

HTH

    
por TomC 24.09.2013 / 08:01
0

Se você não se importa se a publicação é "publicada" ou não, apenas deseja que seja acessada por qualquer pessoa no URL publicado regularmente e não apareça na página principal / resultados da pesquisa / feeds RSS etc., este plug-in trabalhou com O WP 4.6.1 e permite ajustar a localização de um post:

enlace

    
por Sarah Northway 29.10.2016 / 01:36