Tengo varias publicaciones no publicadas en mi sitio web de Wordpress y estoy tratando de hacer que sea accesible para usuarios normales (que no han iniciado sesión) utilizando los mensajes de publicación normales ( site.com/post-here
). Entiendo que puede que no sea la mejor práctica, pero para mi propósito especial, esto debe hacerse.
Intenté agregar el siguiente fragmento de código en mi functions.php
archivo:
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');
También he intentado init
hook en lugar de after_setup_theme
. Sin suerte.
Tengo entendido que los cambios en los roles se guardan en la base de datos, por lo que solo deben hacerse una vez. Es por eso que estoy usando after_setup_theme
hook para llamar a la función.
Pero cuando intento acceder a la página como un usuario normal, se me muestra una página 404 en lugar de mostrar el contenido de la publicación. También intenté cargar la URL de vista previa ( site.com/?p=212&preview=true
) pero tampoco funcionó.
Estas son mis conjeturas:
- el usuario normal no tiene suficiente
caps
para leer la publicación de borradores. - No es posible probar y ver borradores de publicaciones en el front-end para ningún usuario (incluidos los administradores).
¿Qué cambios tengo que hacer para lograr lo que estoy tratando de hacer? Si no es posible, ¿qué soluciones alternativas sugiere?
Nota: no estoy buscando soluciones basadas en complementos.
fuente
Respuestas:
No puede asignar capacidades a usuarios desconocidos. Si desea hacer que una publicación sea visible para todos, cree una URL separada para estas publicaciones y agregue un elemento de control al editor de publicaciones para habilitar la vista previa solo en las publicaciones seleccionadas.
Cuando se llama a dicha URL, verifique si se permite una vista previa de la publicación y si la publicación aún no se ha publicado. También asegúrese de que los motores de búsqueda ignoren esta URL.
Para la URL, usaría un punto final :
Ahora puede crear URL como ...
... ¿Dónde está
123
la identificación de la publicación?Luego use un controlador de devolución de llamada para inspeccionar la ID de la publicación, verificar si es válida y sobrescribir la consulta principal. Este es probablemente el único caso de uso aceptable para
query_posts()
. :)Digamos que el punto final es una clase
T5_Endpoint
(un modelo), y el controlador de salida es una claseT5_Render_Endpoint
(una vista) que hace que el modelo se pase antes. Entonces, probablemente hay un métodorender()
llamadotemplate_redirect
:$this->meta
es otro modelo (claseT5_Post_Meta
) para el metavalor posterior que controla si se permite una vista previa. El control se establece en el cuadro Publicar ( acciónpost_submitbox_misc_actions
), representado por otra vista que obtiene la misma metaclase.Entonces,
T5_Post_Meta
sabe dónde y cuándo almacenar el metavalor, las vistas hacen algo con él.Además, conéctese
transition_post_status
para eliminar el metacampo de la publicación cuando se publique la publicación. No queremos desperdiciar recursos, ¿verdad?Esto es solo un esbozo. Hay muchos detalles para cubrir ... He escrito un pequeño complemento que muestra cómo implementar esto: T5 Public Preview .
fuente
Resolví este problema en lo que pensé que era una forma más simple que la respuesta de @ toscho anterior.
Mi caso de uso es que estoy usando la misma base de datos para un sitio interno de organización de la intranet y un sitio público, y el flujo de trabajo es que los autores escriben borradores y los comparten con otros usuarios que ven esos borradores en el sitio de la intranet, antes de publicar. Específicamente no quería exigir a los revisores que inicien sesión para ver borradores, por lo que solo estoy dependiendo de una constante,
ENV_PRODUCTION
que se establece en el archivo wp-config en función del nombre de host en$_SERVER['SERVER_NAME']
. Eso es lo queENV_PRODUCTION
están haciendo los controles aquí; simplemente acortando todos estos filtros si se está viendo el sitio de producción.Esto es un poco extraño, ya que debes conectarte después de que WP_Query elimine todas las publicaciones de la matriz $ wp_query-> posts, pero me parece estable y seguro.
Hay dos partes separadas para los filtros.
fuente
ENV_PRODUCTION
constante si está en producción. Estaba usando domain.com para la producción y staging.domain.com para la puesta en escena, así que mi línea fuedefine( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );
¿ Eso ayuda?Creo que el complemento "User Role Editor" disponible en el sitio web de WordPress.org podría ser lo que estás buscando. Por cierto, ¿por qué quieres dar acceso a tus borradores a todos? Personalmente, no puedo pensar en una instancia en la que esto sea necesario.
fuente
Simplemente puede cambiar la visibilidad en la página / publicación a "Privada", que solo es visible para Editores y Administradores y no para visitantes públicos, motores de búsqueda, feeds RSS, etc.
fuente
Creo que el comentario de GM es el mejor aquí. Supongo que está intentando hacer lo siguiente:
¿Es eso correcto?
Desafortunadamente, no puedo pensar en una forma simple de hacer esto. Puede publicarlo como una publicación privada para que necesiten ingresar una contraseña para verla, pero debe iniciar sesión para esto. También podría protegerlo con contraseña, pero aún aparecerá en su feed y lista de publicaciones recientes, etc. ¿No podría crear una cuenta de usuario invitado y darles el nombre de usuario / contraseña cuando les dé la URL?
Lea aquí para más información: http://codex.wordpress.org/Content_Visibility
Alternativamente, hay un complemento que podría satisfacer sus necesidades: http://wordpress.org/extend/plugins/shareadraft/ Eché un vistazo rápido al código y parece que el desarrollador está modificando el valor devuelto por get_post_status para que pueda estar capaz de jugar con eso:
http://codex.wordpress.org/Function_Reference/get_post_status
HTH
fuente
Si no le importa si la publicación está "publicada" o no, solo desea que todos puedan acceder a ella en la URL publicada normal y que no se muestre en la página principal / resultados de búsqueda / feeds rss, etc., este complemento funcionó con WP 4.6. 1 y le permite ajustar dónde aparece una publicación:
https://wordpress.org/plugins/wp-hide-post/
fuente