Cómo excluir publicaciones protegidas con contraseña en el bucle de WordPress

4 minutos de lectura

Tengo un tipo de publicación personalizada que admite entradas protegidas con contraseña. En un bucle personalizado que usa un nuevo objeto WP_Query, quiero excluir esas publicaciones protegidas con contraseña de los resultados. ¿Qué argumentos necesito establecer para hacer esto? Estoy usando la última versión troncal de WordPress 3.2.1.

  • Desde WordPress 3.9 también hay un has_password query arg que puede usar.

    – JD

    12 de octubre de 2016 a las 13:08

Llegué a esta pregunta donde estaba buscando lo mismo. Sin embargo, leí el documento WP_Query línea por línea y luego encontré una solución muy simple y eso es solo para agregar 'has_password' => false argumento de la consulta $args

Así que el código será el siguiente…

$args  = [
    'post_type'      => [ 'post', 'page' ],
    'posts_per_page' => 3,
    'post__not_in'   => get_option( 'sticky_posts' ),
    'has_password'   => FALSE
];

Aquí puedes ver que he excluido Sticky y Password Protected publicaciones

  • Todas las respuestas que sugieren el uso de SQL son peligrosas y no deben usarse a partir de WordPress 3.9+. Esta es la forma integrada de excluir publicaciones protegidas con contraseña.

    – sauv0168

    9 mayo 2017 a las 18:20

  • ¡Sí! Esta es la manera de hacerlo.

    – lowtechsun

    12 sep 2019 a las 23:04

Me gusta mucho el enfoque de Kevin, pero lo ajusté un poco:

// Create a new filtering function that will add our where clause to the query
function my_password_post_filter( $where="" ) {
    // Make sure this only applies to loops / feeds on the frontend
    if (!is_single() && !is_admin()) {
        // exclude password protected
        $where .= " AND post_password = ''";
    }
    return $where;
}
add_filter( 'posts_where', 'my_password_post_filter' );

  • Gracias, @Peter Chester, también agregué esta exclusión para el Next Post y Previous Post enlaces (ver mi respuesta).

    – Nelú

    28/04/2014 a las 16:45


  • ¿Alguna idea de cómo aplicar esto para pasar publicaciones protegidas en bucles personalizados en una sola?

    –Andrew Tibbetts

    17 de febrero de 2015 a las 14:20

avatar de usuario
vzwick

¿Le echaste un vistazo a la argumento post_status de WP_Query?

“Protegido” parece un buen candidato para excluir.

Editar: De acuerdo, parece que tendrás que modificar la cláusula where para lograr lo que quieres:

// Create a new filtering function that will add our where clause to the query
function filter_where( $where="" ) {
    // exclude password protected
    $where .= " AND post_password = ''";
    return $where;
}

if (!is_single()) { add_filter( 'posts_where', 'filter_where' ); }
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );

  • Sí, vi eso, pero parece que ese argumento permite el estado de la publicación, es decir, post_status = protegido incluirá todos los estados protegidos, a menos que lo esté usando incorrectamente.

    –Kevin

    24 de septiembre de 2011 a las 12:32

  • Solo especulando, pero ¿has probado post_status=-protected ?

    – vzwick

    24 de septiembre de 2011 a las 12:34

  • los post_where el filtro es el camino a seguir.

    – Pat

    24 de septiembre de 2011 a las 12:45

  • cerca pero no del todo ;-). allí donde debería estar post_password = ” pero esto se aplica a la visualización de entradas individuales, por lo que si bien las excluye de las plantillas de archivo, etc., también muestra un 404 cuando intenta acceder a una sola página.

    –Kevin

    24 de septiembre de 2011 a las 12:49

  • @Kevin Perdón por otro comentario más, pero no puedo hacer ninguna prueba por mi cuenta en este momento… ¿Envuelve el add_filter() declaración en un if (!is_single()) ayuda con el problema 404?

    – vzwick

    24 de septiembre de 2011 a las 13:01

Después de jugar un poco, encontré que el filtro posts_where era demasiado intrusivo para lo que quería hacer, así que se me ocurrió una alternativa. Como parte de la acción ‘save_post’ que adjunté para mi tipo de publicación personalizada, agregué la siguiente lógica;

$visibility = isset($_POST['visibility']) ? $_POST['visibility'] : '';
$protected  = get_option('__protected_posts', array());

if ($visibility === 'password' && !in_array($post->ID, $protected)) {
    array_push($protected, $post->ID);
}
if ($visibility === 'public' && in_array($post->ID, $protected)) {
    $i = array_search($post->ID, $protected);
    unset($protected[$i]);
}
update_option('__protected_posts', $protected);

Lo que esto hace es mantener una matriz de ID de publicación en la tabla de opciones donde la publicación está protegida por una contraseña. Luego, en una consulta personalizada, simplemente pasé esta matriz como parte de la post__not_in opción por ejemplo

$query = new WP_Query(array(
    'post_type' => 'my_custom_post_type',
    'post__not_in' => get_option('__protected_posts'),
));

De esta manera, podría excluir las publicaciones protegidas de una página de archivo pero permitir que un usuario llegue a la página protegida con contraseña para ingresar la contraseña.

avatar de usuario
Nelú

Además de la respuesta de @Peter Chester:

También puede excluir las publicaciones protegidas con contraseña de la Previous Post y Next Post enlaces, si los tiene en la parte inferior de la página de su publicación.

Para hacerlo, puede agregar la exclusión a la get_previous_post_where y get_next_post_where manos.

add_filter( 'get_previous_post_where', 'my_theme_mod_adjacent' );
add_filter( 'get_next_post_where', 'my_theme_mod_adjacent' );
function my_theme_mod_adjacent( $where ) {
    return $where . " AND p.post_password = ''";
}

¿Ha sido útil esta solución?