web-dev-qa-db-fra.com

Afficher toutes les publications et uniquement certains types de publication personnalisés avec des champs méta

J'essaie d'afficher tous les messages et uniquement certains messages personnalisés sur la page d'accueil.

Essentiellement: (post_type = post) OR (post_type = exhibition AND featured = 1)

Je suis coincé avec la mise en œuvre réelle cependant.

pre_get_posts et $query->set(...); ne semblent pas autoriser la logique sur le post_type, il semble que vous ne puissiez définir que (post OR exhibition) AND (featured=1).

Je préférerais ne pas avoir à définir featured=1 sur chaque message.

Toute aide appréciée.

1

Vous ne pouvez pas spécifier OR ou AND sur des arguments WP_Query arbitraires. Les requêtes méta et taxonomie vous permettent de spécifier OR ou AND pour ces requêtes, mais les autres arguments sont tous combinés (post_type est une propriété de la publication, pas une méta, donc une méta-requête ne vous aidera pas). Reportez-vous à la documentation pour chacun des arguments possibles et comment les utiliser.

Vous verrez que certains arguments prennent en charge un tableau comme une valeur, telle que post_type, de sorte que vous pouvez passer 'post_type' => ['post', 'exhibition'] et qu'il obtiendra les publications exhibition et post.

Cependant, lorsque vous faites cela, vous ne pouvez pas spécifier qu'un autre argument ou méta-requête s'applique uniquement à l'un des types de publication.

Si les articles doivent être affichés séparément, vous pouvez simplement exécuter 2 requêtes. Sinon, vous devrez interroger directement la base de données avec wpdb . Cela ressemblerait à quelque chose comme:

global $wpdb;

$results = $wpdb->get_results(
    "SELECT 
        posts.* 
    FROM 
        $wpdb->posts posts 
    LEFT JOIN 
        $wpdb->postmeta ON 
            ( posts.ID = postmeta.post_id AND postmeta.meta_key = 'featured' )
    WHERE
        posts.post_type = 'post' OR
        ( posts.post_type = 'exhibition' AND postmeta.meta_value = '1' )
    "
);

Je ne l'ai pas testé, mais c'est une idée approximative. Vous devez également ajouter du code SQL pour le nombre de messages et pour toute commande.

Il existe également les filtres posts_where et posts_join que vous pouvez utiliser pour modify la requête existante pour les publications. C'est un peu plus compliqué, mais si vous avez besoin de modifier la requête principale ou si vous vous fiez à d'autres arguments WP_Query et que vous ne voulez pas avoir à réécrire leur code SQL, vous devriez utiliser ces fichiers.

1
Jacob Peattie

Si vous essayez de renvoyer des publications personnalisées, utilisez ceci.

$args = array(
          'numberposts'=> -1,
          'post_type' => 'custom post type name'
        );
$results = get_posts( $args ); //get all post data results

foreach ($results as $rel){//sift through data and find relevant meta data
  $ret = get_post_meta($rel->ID,'meta_field',true);
  if(!empty($ret)){
      //do something with this post data
  }

}

Tous les messages qui entrent dans ce type de message s’en trouveront. J'espère que cela vous aidera à démarrer.

0
Cam