web-dev-qa-db-fra.com

Comment trouver l'attachement par son nom?

Est-il possible d'obtenir l'identifiant de pièce jointe par son nom? Et à la fois, il est peut-être possible d’obtenir un poste parent auquel cette pièce jointe est assignée?

1
Kirix

Vous devez écrire un code personnalisé pour obtenir l'id de la pièce jointe et le post_parent par-nom / slug ou nom_fichier (s'il n'a pas été modifié lors du téléchargement de fichiers).

Mettez le code ci-dessous dans le fichier functions.php file

if( ! ( function_exists( 'wp_get_attachment_by_post_name' ) ) ) {
    function wp_get_attachment_by_post_name( $post_name ) {
            $args           = array(
                'posts_per_page' => 1,
                'post_type'      => 'attachment',
                'name'           => trim( $post_name ),
            );

            $get_attachment = new WP_Query( $args );

            if ( ! $get_attachment || ! isset( $get_attachment->posts, $get_attachment->posts[0] ) ) {
                return false;
            }

            return $get_attachment->posts[0];
    }
}

alors vous pouvez appeler la fonction où vous en avez besoin comme ci-dessous: -

$attachment = wp_get_attachment_by_post_name( $post_name );
// Replace post_name by the name/slug of the attachment
// It will give you an object, which you can render like below to get the ID and post_parent
if ( $attachment ) {
    echo $attachment->ID; // Gives the id of the attachment
    echo $attachment->post_parent; // Gives the post_parent id
    echo $attachment->post_title; // Gives the attachment title.
}
6
Maruti Mohanty

Une autre approche possible consiste à utiliser directement $ wpdb pour effectuer une requête SQL, dans la table posts, avec le titre de l'article recherché et avec post_type "attachment".

function get_attachment_url_by_title( $title ) {
    global $wpdb;

    $attachments = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_title = '$title' AND post_type = 'attachment' ", OBJECT );
    //print_r($attachments);
    if ( $attachments ){

        $attachment_url = $attachments[0]->guid;

    }else{
        return 'image-not-found';
    }

    return $attachment_url;
}
// usage:
get_attachment_url_by_title('your_image_title');

Gardez à l'esprit que ce code renverra la première pièce jointe avec ce titre.


Manière alternative, sans requête SQL. Mieux dans la plupart des cas:

function get_attachment_url_by_title( $title ) {

$attachment = get_page_by_title($title, OBJECT, 'attachment');
//print_r($attachment);

  if ( $attachment ){

    $attachment_url = $attachment->guid;

  }else{
    return 'image-not-found';
  }

  return $attachment_url;
}

echo get_attachment_url_by_title('your_image_title');
2
Snade

get_page_by_title() fera l'affaire.

Avec une URL complète en tant que titre:

get_page_by_title( pathinfo( 'https://www.example.com/file.jpg' )['filename'], "OBJECT", 'attachment' );

Retourne WP_Post Object ou Null, si aucune publication/pièce jointe n'a été trouvée.

0
Lukas Heuser

Base sur WordPress Codex ,

pièce jointe '- une pièce jointe. Alors que le post_status par défaut de WP_Query est 'publier', les pièces jointes ont un post_status par défaut de 'inherit'. Cela signifie qu'aucune pièce jointe ne sera renvoyée sauf si vous définissez explicitement post_status sur 'inherit' ou 'any'. (Voir post_status ci-dessous)

0
J. Li