web-dev-qa-db-fra.com

Obtenir une pièce jointe par la valeur meta_key

Je dois obtenir la pièce jointe (une seule par publication) associée à une publication avec meta_key wpcf-legislacion-gratis (quelle que soit la valeur de la colonne) à l'aide d'une requête personnalisée utilisant la fonction get_posts(). J'ai essayé cela de deux manières:

$nonActivePlan_args   = array(
    'order'           => 'desc',
    'meta_query'          => array(
            array(
                'key'     => 'wpcf-legislacion-gratis',
                'value'   => NULL,
                'compare' => '!='
            )
    ),
    'post_status'         => 'inherit',
    'posts_per_page'      => 1,
    'post_type'   => 'attachment',
    'post_parent' => get_the_ID(),
);

$nonActivePlanAttachment = get_posts( $nonActivePlan_args );
if ($nonActivePlanAttachment) {
    foreach ($nonActivePlanAttachment as $attachment) { ?>
        <div class="legislacion-ico">
            <a class="pdf" href="<?php echo wp_get_attachment_url( $attachment->ID, true ); ?>">
                <img src="<?php echo get_template_directory_uri(); ?>/images/ico_descargas.png">
                <br>
                Descargar PDF
            </a>
        </div>
    <?php
    }
}

wp_reset_postdata();

Relatif à celui ci-dessus, j'ai des doutes:

  • Comment puis-je écrire la requête pour trouver la pièce jointe avec meta_key égal à wpcf-legislacion-gratis, peu importe les valeurs dont il dispose?
  • La boucle sur ce cas est-elle la bonne? Remarquez que je n'aurai qu'un wpcf-legislacion-gratis par publication. Dois-je parcourir les résultats? Ne devrait pas être un seul?
  • Si je vais séparer les deux pièces jointes (comme vous le verrez dans la requête à la fin du message) dois-je exécuter wp_reset_postdata()?

J'ai aussi essayé ce code:

$nonActivePlan_args   = array(
    'order'             => 'desc',
    'meta_key'          => 'wpcf-legislacion-gratis',
    'post_status'       => 'inherit',
    'posts_per_page'    => 1,
    'post_type'         => 'attachment',
    'post_parent'       => get_the_ID(),
);

Mais cela ne fonctionne pas, ce qui signifie que je n’obtiens aucune valeur de DB. Voici le résultat de la requête que j'ai exécutée sur la ligne de commande MySQL:

SELECT * FROM `wp_postmeta` where post_id='11839';
+---------+---------+-------------------------+-----------------------------------------------------------------------------------+
| meta_id | post_id | meta_key                | meta_value                                                                        |
+---------+---------+-------------------------+-----------------------------------------------------------------------------------+
|   22149 |   11839 | wpcf-legislacion-gratis | http://jurisprudencia.dev/wp-content/uploads/2015/02/modelodatos.pdf              |
|   22150 |   11839 | wpcf-legislacion-pagada | http://jurisprudencia.dev/wp-content/uploads/2015/02/AtencionUsuario_version1.pdf |
+---------+---------+-------------------------+-----------------------------------------------------------------------------------+

J'ai aussi vérifié les documents ici et ici mais n'en ai trouvé aucun utile pour moi.

Comment puis-je obtenir la pièce jointe? Toute aide ou conseil?

1
ReynierPM

Je pense que ce que vous recherchez, c'est get_post_meta() et non une requête personnalisée.

LES RAISONS:

  • Les résultats des champs personnalisés sont mis en cache et extrêmement rationalisés lorsque les performances sont optimales. Vous pouvez lire cette réponse je l'ai fait récemment qui expliquera tout

  • Vous essayez d’obtenir le champ personnalisé associé à un message uniquement dans une page de message unique. C’est pourquoi get_post_meta() a été conçu

Vous pouvez remplacer tout votre code par quelque chose comme ceci: ( modifié à partir du codex )

$key_1_value = get_post_meta( get_the_ID(), 'wpcf-legislacion-gratis', true ); 
// check if the custom field has a value 
if( ! empty( $key_1_value ) ) { 
    echo $key_1_value; 
} 

MODIFIER

Si vous devez obtenir la valeur du champ personnalisé en dehors de la boucle, comme dans une barre latérale ou une fonction, vous devez remplacer get_the_ID() par get_queried_object_id().

$key_1_value = get_post_meta( get_queried_object_id(), 'wpcf-legislacion-gratis', true ); 
// check if the custom field has a value 
if( ! empty( $key_1_value ) ) { 
    echo $key_1_value; 
} 
1
Pieter Goosen