Eu tenho vários posts não publicados no meu site do Wordpress e estou tentando torná-lo acessível para usuários normais (que não estão logados) usando as lesmas de publicação normais ( site.com/post-here
). Entendo que pode não ser a melhor prática, mas para meu objetivo especial, isso precisa ser feito.
Tentei adicionar o seguinte trecho de código ao meu functions.php
arquivo:
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
gancho em vez de after_setup_theme
. Sem sorte
Meu entendimento é que as alterações nas funções são salvas no banco de dados e, portanto, precisam ser feitas apenas uma vez. É por isso que estou usando o after_setup_theme
gancho para chamar a função.
Mas quando tento acessar a página como um usuário normal, aparece 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 o suficiente
caps
para ler a postagem dos rascunhos. - não é possível testar e visualizar postagens de rascunho no front-end para nenhum usuário (incluindo administradores).
Que mudanças eu tenho que fazer para realizar o que estou tentando fazer? Se não for possível, que soluções alternativas você sugere?
Nota: Não estou procurando soluções baseadas em plug-ins.
fonte
Respostas:
Você não pode atribuir recursos a usuários desconhecidos. Se você deseja tornar uma postagem visível para todos, crie um URL separado para essas postagens e adicione um elemento de controle ao editor de postagens para ativar a visualização apenas nas postagens selecionadas.
Quando esse URL é 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, eu usaria um ponto de extremidade :
Agora você pode criar URLs como…
… Onde
123
está o ID da postagem.Em seguida, use um manipulador de retorno de chamada para inspecionar o ID da postagem, verifique se é válido e substitua a consulta principal. Este é provavelmente o único caso de uso aceitável para
query_posts()
. :)Digamos que o terminal seja uma classe
T5_Endpoint
(um modelo) e o manipulador de saída seja uma classeT5_Render_Endpoint
(uma visualização) que recebe o modelo passado anteriormente. Provavelmente existe um métodorender()
chamadotemplate_redirect
:$this->meta
é outro modelo (classeT5_Post_Meta
) para o pós-valor meta que controla se uma visualização é permitida. O controle é definido na caixa Publicar ( açãopost_submitbox_misc_actions
), renderizada por outra exibição que obtém a mesma meta classe.Então,
T5_Post_Meta
sabe onde e quando armazenar o meta-valor, as visualizações fazem algo com ele.Além disso, conecte-se
transition_post_status
para excluir o meta campo da postagem quando a postagem for publicada. Não queremos desperdiçar recursos, certo?Este é apenas um esboço. Há muitos detalhes a serem abordados ... Eu escrevi um pequeno plugin que mostra como implementar isso: Visualização pública do T5 .
fonte
Resolvi esse problema da maneira que pensei ser mais simples do que a resposta de @ toscho acima.
Meu caso de uso é que estou usando o mesmo banco de dados para um site de armazenamento temporário da intranet interno e um site voltado para o público, e o fluxo de trabalho é que os autores escrevem rascunhos e o compartilham com outros usuários que visualizam esses rascunhos no site da intranet, antes da publicação. Especificamente, eu não queria exigir que os revisores fizessem login para ver rascunhos, portanto, apenas dependo de uma constante,
ENV_PRODUCTION
que é definida no arquivo wp-config com base no nome do host$_SERVER['SERVER_NAME']
. Isso é o que as verificaçõesENV_PRODUCTION
aqui estão fazendo; apenas um curto-circuito em todos esses filtros se o site de produção estiver sendo visualizado.Isso é um pouco estranho, porque você precisa se conectar após o WP_Query remover todas as postagens da matriz $ wp_query-> posts, mas parece estável e seguro para mim.
Existem duas partes separadas para os filtros.
fonte
ENV_PRODUCTION
constante se estiver em produção. Eu estava usando domain.com para produção e staging.domain.com para teste, então minha linha foi:define( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );
Isso ajuda?Eu acho que o plugin "User Role Editor" disponível no site WordPress.org pode ser o que você está procurando. A propósito, por que você deseja dar acesso a seus rascunhos para todos? Pessoalmente, não consigo pensar em um caso em que isso seria necessário.
fonte
Você pode alterar a visibilidade da página / postagem para "Privado", visível apenas para editores e administradores, e não para visitantes públicos, mecanismos de pesquisa, feeds RSS, etc.
fonte
Eu acho que o comentário da GM é o melhor aqui. Presumo que você esteja tentando fazer o seguinte:
Isso está correto?
Infelizmente, não consigo pensar em nenhuma maneira simples de fazer isso. Você pode publicá-la como uma publicação particular, para que eles precisem digitar uma senha para visualizá-la, mas você precisa estar logado para isso. Você também pode protegê-lo com senha, mas ele ainda aparecerá no seu feed e na lista de postagens recentes, etc. Não foi possível criar uma conta de usuário convidado e fornecer o nome de usuário / senha ao fornecer o URL?
Leia aqui para mais informações: http://codex.wordpress.org/Content_Visibility
Como alternativa, existe um plug-in que pode atender às suas necessidades: http://wordpress.org/extend/plugins/shareadraft/ 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 capaz de brincar com isso:
http://codex.wordpress.org/Function_Reference/get_post_status
HTH
fonte
Se você não se importa se a publicação é "publicada" ou não, apenas deseja que ela seja acessível por qualquer pessoa no URL normal publicado e não apareça na página principal / resultados da pesquisa / feeds RSS, etc., este plug-in funcionou com o WP 4.6. 1 e permite ajustar onde uma postagem aparece:
https://wordpress.org/plugins/wp-hide-post/
fonte