Si desea una respuesta más sencilla, puede usar la siguiente consulta SQL para obtener todas las publicaciones que sean publicaciones, páginas o taxonomías personalizadas en cualquier momento, incluso si no se han activado enlaces en absoluto. de todavia.
SQL sin formato:
SELECT 'id', 'post_type' AS 'type', 'post_author' AS 'author', 'post_name' AS
'slug', 'post_status' AS 'status'
FROM wp_posts
WHERE 'post_type' NOT IN ('attachment', 'nav_menu_item', 'revision')
AND 'post_status' NOT IN ('draft', 'trash')
ORDER BY 'id';
Esto funciona incluso en la primera línea de su archivo de funciones, incluso antes de los enlaces mu_plugins_loaded
o init
.
@note
Esto supone que tiene un prefijo de base de datos estándar wp_posts
. Si necesita tener en cuenta los prefijos de variables, puede obtener la tabla de publicaciones correcta a través de PHP con bastante facilidad haciendo lo siguiente:
<?php
global $wpdb;
$table = $wpdb->posts;
$query = "SELECT 'id', 'post_type' AS 'type', 'post_author' AS 'author', 'post_name' AS
'slug', 'post_status' AS 'status'
FROM " . $table . "
WHERE 'post_type' NOT IN ('attachment', 'nav_menu_item', 'revision')
AND 'post_status' NOT IN ('draft', 'trash')
ORDER BY 'id';"
A continuación, ejecute con $wpdb
, mysqli
o con una instancia PDO
. Como no hay ninguna entrada del usuario en esta consulta, es seguro ejecutarla sin una declaración preparada siempre y cuando no le inyectes ninguna variable.
Sugeriría almacenar esto como un valor estático privado de una clase, por lo que se puede acceder sin tener que volver a realizar la consulta más de una vez por página para obtener el mejor rendimiento, algo como esto:
class Post_Cache
{
private static $post_cache;
public function __construct()
{
//This way it skips the operation if it's already set.
$this->initCache();
}
public function get($id, $type = null)
{
if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) )
return false;
}
if ( !is_null( $type ) )
{
//returns the specific column value for the id
return self::$post_cache[$id][$type];
}
//returns the whole row
return self::$post_cache[$id];
}
private function initCache()
{
if ( is_null(self::$post_cache) )
{
$query = "...";
$result = some_query_method($query); //Do your query logic here.
self::$post_cache = $result;
{
}
}
Usuario
$cache = new \Post_Cache();
//Get the page slug
$slug = $cache->get( get_the_ID(), 'slug');
if ($cache->get( get_the_ID() ))
{
//post exists
} else {
//nope, 404 'em
}
if ( $cache->get( get_the_ID(), 'status') === 'publish' )
{
//it's public
} else {
//either check current_user_can('whatever_permission') or just 404 it,
//depending whether you want it visible to the current user or not.
}
if ( $cache->get( get_the_ID(), 'type') === 'post' )
{
//It's a post
}
if ( $cache->get( get_the_ID(), 'type') === 'page' )
{
//It's a page
}
Tienes la esencia. Si necesita más detalles, puede obtenerlos según lo normal con new \WP_Post( get_the_ID() );
Esto le permitirá revisar las publicaciones en cualquier momento, incluso si el bucle de wordpress no ha alcanzado un punto en el que encuentre que su solicitud es aceptable. Esta es una versión ligeramente más optimizada de la misma consulta ejecutada por el núcleo de Wordpress. Este filtra todos los mensajes no deseados que no desea que se devuelvan, y solo le ofrece una lista bien organizada con el id. De autor, el tipo de publicación, el slug y la visibilidad relevantes. Si necesita más detalles, puede obtenerlos según lo normal con new \WP_Post($id);
, o usar cualquiera de las otras funciones nativas de Wordpress con cualquiera de las filas relevantes de la tabla, incluso fuera del bucle.
Utilizo una configuración similar en un par de mis propios temas y complementos personalizados, y funciona bastante bien. También es seguro y no deja datos internos flotando en el ámbito global, donde pueden ser anulados como la mayoría de las cosas en Wordpress.