Comprobar existencia de un post por id en wordpress

8 minutos de lectura

tengo una identificación:

$id = 151;

Quiero comprobar la existencia de esta manera:

$content = get_post($id);
if ($content)
    echo "post $id already exists";
else
    echo "post $id does not exists or was deleted";

Pero en los foros de WP siempre parece preferir preguntar a DB:

global $wpdb;
$post_exists = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE id = '" . $id . "'", 'ARRAY_A');
if ($post_exists)
    echo "post $id exists";
else
    echo "post $id does not exist";

Entonces, ¿cuál es el mejor método? De hecho, prefiero la facilidad de la primera.

  • Creo que es muy irresponsable no considerar la eficiencia de las llamadas tal como se procesan en el servidor. Las implementaciones genéricas de C/C++ no suelen estar optimizadas para todo y se debe tener en cuenta la escalabilidad de las llamadas. Existe un equilibrio entre la optimización y la mantenibilidad, pero hacer una declaración abierta de que el mundo de PHP no debería preocuparse por el uso de recursos es simplemente ingenuo y, en última instancia, perezoso. Puede llevar su argumento al extremo y hacer que un equipo de programadores de php publique código basura y descansar con la seguridad de que las bibliotecas del sistema operativo subyacentes van a

    – lagpro

    14 de febrero de 2014 a las 6:08

Creo que lo mejor es consultar la base de datos directamente lo menos posible.

Puede usar la función get_post_status().

Devuelve falso si la publicación no existe.

if ( get_post_status ( $post_id ) ) {
    // do stuff
}

o, para asegurarse de que la publicación se publique

if ( 'publish' == get_post_status ( $post_id ) ) {
    // do stuff
}

http://codex.wordpress.org/Function_Reference/get_post_status

  • Revisé la fuente de get_post_status y usa get_post. ¿Por qué no usar directamente null !== get_post( $post_id )?

    – Jürgen Paul

    15 de febrero de 2016 a las 10:31

  • @Michelle Estaba pensando lo mismo, pero devuelve un montón de datos adicionales. ¿No sería igual de limpio hacer lo que sugirió csag? Cualquiera de las dos formas es limpia y usa WordPress y no wpdb. 🙂

    – cbloss793

    6 de noviembre de 2017 a las 19:19

  • Casi siempre estoy de acuerdo con el sentimiento de que debe evitar una consulta directa a la base de datos cuando sea posible. Pero en este caso, creo que vale la pena escribir una función personalizada que sea más eficiente que get_post. La función central post_exists llama a la base de datos directamente, por lo que creo que deberíamos hacer lo mismo para verificar si existe una identificación de publicación. stackoverflow.com/a/69328684/947370

    – caramelo cuadrado

    25/09/2021 a las 17:55


if( is_null(get_post($id))){

      echo "post $id does not exists or was deleted";

}else{

       echo "post $id already exists";

}

  • Si bien esto puede responder a la pregunta, es mejor agregar una descripción sobre cómo esta respuesta puede ayudar a resolver el problema. Lea ¿Cómo escribo una buena respuesta para saber más?

    – Roshana Pitigala

    02/07/2018 a las 18:50

  • Tenga en cuenta que, con este enfoque, las publicaciones en la papelera aún se consideran existentes.

    – CragMonkey

    5 de enero de 2019 a las 19:51

avatar de usuario
AlFra

Sé que esta es una publicación muy antigua, pero aún así … Si desea verificar si existe una publicación con cierta identificación, también puede usar la función de wordpress get_permalink.

Ejemplo:

if( get_permalink( $post_id ) ):
echo "does exist";
else:
echo "does not exist";
endif;

Tenga en cuenta que la función get_permalink también devuelve la página, los enlaces adjuntos y no solo las publicaciones.

  • Vale la pena señalar que get_permalink() llama a get_post. Entonces, si está haciendo esto por razones de rendimiento, todavía hace la misma llamada get_post() de todos modos.

    – Matt Keys

    8 de agosto de 2018 a las 21:44

Utilizar el WP_Query class para una solución eficiente y sin SQL:

$id = 151;

$post_exists = (new WP_Query(['post_type' => 'any', 'p'=>$id]))->found_posts > 0;

if ($post_exists)
    echo "post $id already exists";
else
    echo "post $id does not exists or was deleted";

Tenga en cuenta que ambos get_post_status y get_permalink cargar datos extraños.

Preferiría consultar la base de datos en lugar de la llamada get_post.

El contenido de la publicación puede ser de gran tamaño. Consultar y enviar todo el contenido de la publicación a una cadena solo para verificar si existe es increíblemente derrochador e ineficiente.

Si no desea consultar la base de datos directamente, tal vez usar get_post_field para extraer uno de los campos más pequeños sería igual de efectivo, pero menos derrochador.

  • No creo que en el mundo de PHP debamos preocuparnos demasiado por el uso de los recursos. Deja eso para los programadores de C. PHP y MySQL son lo suficientemente inteligentes como para administrarlo por sí mismos. Hay otras consideraciones como DRY y la limpieza del código. gracias

    – Ígor Parra

    9 de enero de 2014 a las 13:38


  • No es una cuestión de PHP y MySQL administrando recursos. Se trata de que el programador consuma imperativamente recursos innecesarios. Es como usar SELECT * en todas partes. La actitud de simplemente agarrar todo eventualmente lo arruinará en cualquier cosa menos en sitios pequeños, especialmente si su base de datos y servidores HTTP están en diferentes hosts.

    – David Bullock

    14 de febrero de 2014 a las 0:45

avatar de usuario
dulcescuadrados

Decidí mirar el código central existente para inspirarme aquí. Ya hay una función para post_existe pero solo verifica títulos, contenido, estado, etc. Puede ver la fuente completa aquí.

Tenga en cuenta que con el propósito de verificar si algo existe, el código en el núcleo consulta directamente la base de datos y solo extrae la identificación, no todos los datos de la publicación completa. Esto es muy eficiente y digno de copiar este método. Esto es lo que se me ocurrió:

<?php
if ( ! function_exists( 'post_id_exists' ) ) :
    function post_id_exists( $post_id ) {
        global $wpdb;
        $post_id = (int) $post_id; // cast as INT to sanitize
        if ( $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE ID=%s", array( $post_id ) ) ) ) {
            return 1;
        }
        return 0;
    }
endif;

La respuesta aceptada dice “consultar la base de datos directamente lo menos posible”. A grandes rasgos, para los nuevos desarrolladores de WordPress, este es un buen consejo. Pero creo que el mejor consejo es evitar la dispersión de un montón de llamadas directas a la base de datos repetitivas en su código personalizado y evitar las llamadas directas a la base de datos cuando hay una función existente que ya hace exactamente lo que está buscando. En este caso, hemos encontrado una instancia de una función que tal vez desearíamos que estuviera en el núcleo, pero no hay una forma eficiente de hacerlo con las funciones del núcleo. Para este caso excepcional, debemos escribir una función que consulte la base de datos y usar el código central como modelo de cómo hacerlo de manera eficiente y segura.

get_post, get_permalink y otras funciones recomendadas aquí tienen propósitos específicos que serán mucho menos eficientes que una función especialmente diseñada con una consulta creada para ser lo más rápida posible. Y como señalaron otros comentaristas, algunas otras sugerencias como get_post_status en realidad llamar get_post dentro de ellos, por lo que es aún menos eficiente.

  • No creo que en el mundo de PHP debamos preocuparnos demasiado por el uso de los recursos. Deja eso para los programadores de C. PHP y MySQL son lo suficientemente inteligentes como para administrarlo por sí mismos. Hay otras consideraciones como DRY y la limpieza del código. gracias

    – Ígor Parra

    9 de enero de 2014 a las 13:38


  • No es una cuestión de PHP y MySQL administrando recursos. Se trata de que el programador consuma imperativamente recursos innecesarios. Es como usar SELECT * en todas partes. La actitud de simplemente agarrar todo eventualmente lo arruinará en cualquier cosa menos en sitios pequeños, especialmente si su base de datos y servidores HTTP están en diferentes hosts.

    – David Bullock

    14 de febrero de 2014 a las 0:45

avatar de usuario
dldnh

Yo creo que si te dan una función a una llamada, la llamas; use la base de datos para cosas que no son proporcionadas por una función.

  • +1 Si, pienso lo mismo pero busca wordpress check if post exists y aparece un montón de soluciones como la segunda en el http://wordpress.org/support

    – Ígor Parra

    9 de marzo de 2012 a las 17:40


  • Siento que sus instintos son correctos y no puedo explicar por qué alguien recomendaría lo contrario. La única forma de saberlo sería preguntarle a alguien que lo recomiende. Tendría curiosidad por saber la respuesta, si alguna vez escuchas alguna.

    – dldnh

    9 de marzo de 2012 a las 17:50


  • OK, amigo, hagámoslo de la manera correcta, usando la API. @Pekka también piensa lo mismo (¿por qué eliminó su respuesta?). ¡Salud!

    – Ígor Parra

    9 de marzo de 2012 a las 17:56


¿Ha sido útil esta solución?