¿Cómo hacer que la vista previa de la publicación programada sea visible para cualquiera?

2

Cuando escribo una publicación y la programo para una publicación posterior, WordPress me permitirá obtener una vista previa de la publicación como si ya estuviera publicada, pero debo iniciar sesión como administrador (o cualquier persona autorizada para obtener una vista previa de la publicación).

¿Existe alguna forma, posiblemente un parámetro de cadena de consulta, para que cualquier publicación pueda realizar la vista previa, es decir, también para los usuarios anónimos? Algo como my-post?previewsecret=645732116468 ?

    
pregunta Borek Bernard 18.03.2012 - 23:24

2 respuestas

7

Borradores de vistas previas

Eche un vistazo rápido a este fragmento de código del núcleo en query.php , que

  

El estado de la publicación de [Cheques] para determinar si se debe mostrar la publicación.

enlace

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

... es lo que lo hace un tanto no sencillo de omitir para los usuarios que no han iniciado sesión. Puede anular el resultado de esa función si va más profundo Y luego cuidando los roles. Pero eso es demasiado costoso y puede contribuir a la seguridad expuesta.

Si miras un poco más arriba enlace en la línea 2632 encontrará que la publicación se obtiene de la base de datos y se puede filtrar aún más usando el gancho posts_results que viene un par de líneas más abajo.

Almacene el valor de la publicación e inyecte hacia el final después de todas las comprobaciones que anulan la matriz posts . enlace donde the_posts hook está esperando ansiosamente.

Entonces, algo áspero se vería así:

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;
}

Agregue el enlace de la vista previa de su publicación con la clave secreta ?p=4601&key=foryoureyesonly y la publicación se mostrará para cualquier persona. El código tiene algunos complementos sucios, como el alijo, puede usar globals en su lugar (no recomendado), o envolverlo en un objeto (¡sí!) Y ampliar aún más la funcionalidad con contraseñas personalizadas para cada publicación, etc.

Vistas previas programadas

Las vistas previas programadas funcionan de manera muy similar. Los posts_results se rellenan con las publicaciones de estado 'future' de la misma manera y se pueden aprovechar los mismos ganchos. El código funcionará sin cambios para las publicaciones programadas.

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

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

    
respondido por el soulseekah 19.03.2012 - 13:24
1

La respuesta de Soulseekah es increíble, y es exactamente lo que estaba buscando. Al buscar esto, también encontré un complemento (que podría basarse en esta publicación por lo que sé).

Vista previa de publicaciones públicas

    
respondido por el hookedonwinter 28.02.2013 - 19:27

Lea otras preguntas en las etiquetas