Páginas privadas que funcionan cuando no ha iniciado sesión en el administrador de WP

2

Mi comprensión de las publicaciones / páginas privadas es que solo funcionan cuando se inicia sesión en el sistema de administración de WP como administrador o editor.

Tengo un sitio en el que necesito compartir ocasionalmente publicaciones personalizadas para los usuarios a través de enlaces y no quiero que aparezcan en ninguna otra parte del sitio. Establecer publicaciones en "privado" casi hace lo que quiero, ya que elimina instantáneamente las publicaciones de la página de inicio del sitio y otras áreas en las que normalmente se incluiría.

El único problema es que la función de publicación privada asume que quiero ver la publicación cuando inicie sesión en el administrador, lo que no es el caso, ya que aparece un error 404 cuando no estoy conectado. manualmente cuando sea necesario sin una contraseña y para que aparezcan como normales a través de su enlace permanente estándar.

Esto puede ser un territorio de plugin, pero para mi sorpresa no he encontrado uno que haga eso.

Para aclarar, el tipo de publicación en el que necesito implementar esto es un tipo de publicación personalizado definido por un complemento que el sitio necesita para ejecutarse.

    
pregunta AdamJones 28.12.2016 - 13:40

5 respuestas

4

Si no quiere usar un complemento (o no puede encontrar uno que haga lo que necesita), es posible que desee hacerlo de esta manera:

  1. Agregue un meta box personalizado que le permite marcar la publicación como hidden .
  2. Modificar la consulta con pre_get_posts para eliminar las publicaciones que has etiquetado como ocultas en tu sitio (pero estará disponible con un enlace directo).

ACTUALIZAR

Siguiendo la sugerencia anterior, aquí hay una posible solución.

Crear un meta box personalizado

Primero, crea el meta box personalizado al registrar uno:

function yourtextdomain_add_custom_meta_box() {
  add_meta_box("demo-meta-box", "Custom Meta Box", "yourtextdomain_custom_meta_box_markup", "post", "side", "high", null);
}
add_action("add_meta_boxes", "yourtextdomain_add_custom_meta_box");

Agregue el marcado al metabox (una casilla de verificación en el caso):

function yourtextdomain_custom_meta_box_markup($object) {
  wp_nonce_field(basename(__FILE__), "meta-box-nonce"); ?>
    <div>
      <br />
      <label for="meta-box-checkbox">Hidden</label>

      <?php $checkbox_value = get_post_meta($object->ID, "meta-box-checkbox", true);
          if($checkbox_value == "") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true">

      <?php } else if($checkbox_value == "true") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true" checked>

      <?php } ?>

      <p style="color: #cccccc"><i>When selected, the post will be removed from the WP loop but still accessible from a direct link.</i></p>
    </div>
  <?php
}

Esto te dará un meta box para cada publicación que se vea así:

Y finalmente guardar el valor de meta box:

function yourtextdomain_save_custom_meta_box($post_id, $post, $update) {
    if (!isset($_POST["meta-box-nonce"]) || !wp_verify_nonce($_POST["meta-box-nonce"], basename(__FILE__)))
        return $post_id;

    if(!current_user_can("edit_post", $post_id))
        return $post_id;

    if(defined("DOING_AUTOSAVE") && DOING_AUTOSAVE)
        return $post_id;

    $slug = "post";

    if($slug != $post->post_type)
        return $post_id;

    $meta_box_checkbox_value = "";

    if(isset($_POST["meta-box-checkbox"])) {
      $meta_box_checkbox_value = $_POST["meta-box-checkbox"];
    }
    update_post_meta($post_id, "meta-box-checkbox", $meta_box_checkbox_value);
}
add_action("save_post", "yourtextdomain_save_custom_meta_box", 10, 3);

En la tabla wp_postmeta , ahora debería ver el valor meta 'verdadero' asignado a las publicaciones que ha marcado como ocultas y guardadas:

Modificar la consulta con pre_get_posts

Ahora solo es cuestión de filtrar las publicaciones que están marcadas como ocultas de la consulta principal. Podemos hacer esto con pre_get_posts :

add_action( 'pre_get_posts', 'yourtextdomain_pre_get_posts_hidden', 9999 );
function yourtextdomain_pre_get_posts_hidden( $query ){

  // Check if on frontend and main query.
    if( ! is_admin() && $query->is_main_query() ) {

    // For the posts we want to exclude.
    $exclude = array();

    // Locate our posts marked as hidden.
    $hidden = get_posts(array(
      'post_type' => 'post',
      'meta_query' => array(
        array(
          'key' => 'meta-box-checkbox',
          'value' => 'true',
          'compare' => '==',
        ),
      )
    ));

    // Create an array of hidden posts.
    foreach($hidden as $hide) {
      $exclude[] = $hide->ID;
    }

    // Exclude the hidden posts.
    $query->set('post__not_in', $exclude);

    }
}
    
respondido por el Jami Gibbs 30.12.2016 - 14:34
1

En el núcleo de WordPress, las publicaciones privadas son probablemente lo más cerca que puedes estar sin usar un complemento. Como mencionó que necesita enviar enlaces a publicaciones privadas a otros, le recomiendo que no vuelva a inventar la rueda y use uno de los complementos que hacen esto.

Por ejemplo, puedo recomendar altamente Public Post Preview por WordPress Core Committer Dominik Schilling (ocean90). Creo que hace exactamente lo que quieres:

  

Le permite dar un enlace a usuarios anónimos para obtener una vista previa pública de una publicación antes de que se publique.

Se encarga de todas las cosas relacionadas con la caducidad del enlace, las comprobaciones de capacidad, etc., para que no tenga que preocuparse por exponer accidentalmente gran parte de su contenido cuando utiliza una solución personalizada.

    
respondido por el swissspidy 30.12.2016 - 14:19
0

Probablemente territorio de complementos, porque al mencionar la forma en que funcionan las páginas privadas, solo son visibles para los usuarios registrados en el nivel de administrador o editor.

Consulte enlace

No está totalmente claro en su caso de uso, pero es posible que pueda crear un tipo de publicación personalizado que no sea visible en las páginas de índice (establecer público en falso, no agregar un archivo para él, etc.), así que solo alguien Con el permalink pudimos verlo. Sin embargo, alguien podría adivinar el enlace permanente, por lo que no sería totalmente "privado".

enlace

    
respondido por el jetyet47 28.12.2016 - 18:57
0

1) Cree un tipo de publicación personalizado que NO sea público (por ejemplo, "hidden_posts").

2) Cree una plantilla personalizada en el actual y ejecute una consulta $ wpdb personalizada pasando el parámetro post_type a "hidden_posts" en la plantilla

3) Cree una página normal utilizando la plantilla que acaba de crear.

4) Agregue la página en (3) al texto de su robot y niegue el acceso para asegurarse de que no esté indexado.

5) Vota mi respuesta como la mejor :)

NB: Si necesitas un código detallado de esto, ¡avísame!

    
respondido por el codiiv 02.01.2017 - 21:23
0

Puede crear un tipo de publicación personalizada para este tipo de publicaciones que desea mostrar solo para usuarios que no hayan iniciado sesión.

en el puede personalizar el archivo single.php para su tipo de correo personalizado, sustituyéndolo en custom-postype.php. En este puede verificar si el usuario no ha iniciado sesión, puede mostrarlo en caso contrario.

Déjame saber tus puntos de vista a continuación por comentario

    
respondido por el Pratik bhatt 03.01.2017 - 09:06

Lea otras preguntas en las etiquetas