¿Cómo hago que un borrador de publicación sea accesible para todos?

12

Tengo varias publicaciones no publicadas en mi sitio web de Wordpress y estoy tratando de hacerlas accesibles para usuarios normales (que no están registrados) utilizando las babosas de correos normales ( site.com/post-here ). Entiendo que puede que no sea la mejor práctica, pero para mi propósito especial, esto debe hacerse.

He intentado agregar el siguiente fragmento de código en mi archivo 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');

También probé 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 es necesario hacerlo 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 he intentado 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 los borradores.
  • no es posible probar y ver las publicaciones preliminares en el front-end para ningún usuario (incluidos los administradores).

¿Qué cambios debo 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.

    
pregunta Amal Murali 18.07.2013 - 22:14

6 respuestas

12

No puedes asignar capacidades a usuarios desconocidos. Si desea 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 una URL de este tipo, compruebe si se permite una vista previa para la publicación y si la publicación no se ha publicado ya. También asegúrate de que los motores de búsqueda ignoren esta URL.

Para la URL, usaría un punto final :

add_rewrite_endpoint( 'post-preview', EP_ROOT );

Ahora puedes crear URL como ...

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

... donde 123 es el ID de publicación.

Luego use un controlador de devolución de llamada para inspeccionar la ID de la publicación, verifique si es válida y sobrescriba 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 clase T5_Render_Endpoint (una vista) que obtiene el modelo pasado anteriormente. Entonces probablemente hay un método render() llamado 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 es otro modelo (clase T5_Post_Meta ) para el valor meta posterior que controla si se permite una vista previa. El control se establece en el cuadro Publicar ( acción post_submitbox_misc_actions ), representado por otra vista que obtiene la misma meta clase.

Entonces,T5_Post_Metasabedóndeycuándoalmacenarelvalormeta,lasvistashacenalgoconél.
Además, enganche en transition_post_status para eliminar el campo meta de publicación cuando se publique la publicación. No queremos desperdiciar recursos, ¿verdad?

Esto es sólo un esquema. Hay muchos detalles que cubrir ... He escrito un pequeño complemento que muestra cómo implementar esto: T5 Public Preview .

    
respondido por el fuxia 03.10.2013 - 19:05
5

Resolví este problema en lo que pensé que era una forma más sencilla que la respuesta de @ toscho anterior.

Mi caso de uso es que estoy usando la misma base de datos para un sitio interno de preparació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 los ven en el sitio de la intranet. antes de publicar. Específicamente, no quería que los revisores inicien sesión para ver los borradores, así que solo dependo 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 que están haciendo las comprobaciones para ENV_PRODUCTION aquí; simplemente cortocircuitando todos estos filtros si se está viendo el sitio de producción.

Esto es un poco extraño, porque tienes que conectarte después de que WP_Query elimina todas las publicaciones de la matriz $ wp_query- > posts, pero me parece estable y segura.

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

Hay dos partes separadas en los filtros.

  • Un filtro en el gancho "pre_get_posts" establece el post_status predeterminado en 'publish, draft' en el sitio de ensayo. Esto devolverá el borrador de las publicaciones en los listados de archivos.
  • Se necesita un filtro separado para las vistas individuales, porque hay una lógica desagradable en la clase WP_Query para eliminar los borradores de publicaciones de los resultados de la consulta, a menos que el usuario actual pueda editarlos. Resolví esto filtrando 'the_posts', y agregando la publicación que quería volver a los resultados.
respondido por el goldenapples 10.10.2014 - 22:38
0

Creo que el complemento "Editor de funciones de usuario" 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.

    
respondido por el Georgi Demirev 19.07.2013 - 03:27
0

Puede simplemente cambiar la visibilidad en la página / publicación a "Privado", que solo es visible para los editores y administradores y no para los visitantes públicos, los motores de búsqueda, las fuentes RSS, etc.

    
respondido por el NickJAB 03.09.2013 - 00:09
0

Creo que el comentario de G.M. es el mejor aquí. Supongo que está intentando hacer lo siguiente:

  1. escribe una publicación
  2. Guardar como borrador
  3. Permitir que un usuario externo (no registrado) vea el borrador para su aprobación
  4. publicar

¿Eso es correcto?

Desafortunadamente, no puedo pensar en una forma simple de hacer esto. Podrías publicarlo como una publicación privada para que necesiten ingresar una contraseña para verla pero necesitas iniciar sesión para esto. También puede protegerlo con contraseña, pero aún así aparecerá en su feed y en la lista de publicaciones recientes, etc. ¿No puedes crear una cuenta de usuario invitado y darles el nombre de usuario / contraseña cuando les das la URL?

Lea aquí para obtener más información: enlace

Alternativamente, hay un complemento que puede satisfacer sus necesidades: enlace Eché un vistazo rápido al código y parece que el desarrollador está modificando el valor devuelto por get_post_status para que puedas jugar con eso:

enlace

HTH

    
respondido por el TomC 24.09.2013 - 08:01
0

Si no te importa si la publicación está "publicada" o no, simplemente quieres que sea accesible para cualquier persona en la URL publicada regularmente y no aparezca en la página principal / resultados de búsqueda / feeds RSS, etc., este complemento funcionó con WP 4.6.1 y le permite ajustar con precisión dónde aparece una publicación:

enlace

    
respondido por el Sarah Northway 29.10.2016 - 01:36

Lea otras preguntas en las etiquetas