web-dev-qa-db-fra.com

Ajouter un nouveau bouton "Insérer dans le message" avec une autre fonction

Problème: ajoutez un crochet qui ajoute automatiquement un balise courte aux pièces jointes vidéo lorsqu'il est inséré à partir de l'onglet Médiathèque (vidéo):

Mettre à jour:

Cela fonctionne sous l'onglet "Médiathèque" - et ne casse pas les insertions d'images, etc.:

add_filter('media_send_to_editor', 'my_filter_iste', 20, 3);

function my_filter_iste($html, $id, $caption, $title, $align, $url, $size, $alt) {
    $attachment = get_post($id); //fetching attachment by $id passed through

    $mime_type = $attachment->post_mime_type; //getting the mime-type
    if (substr($mime_type, 0, 5) == 'video') { //checking mime-type
        $src = wp_get_attachment_url( $id );
        $html = '[video src="'.$src.'"]';  
    }
    return $html; // return new $html
}

Insère quelque chose comme ceci: [video src = "chemin/vers/video/sample.mp4"]

Si vous sentez que vous pouvez nettoyer le code, par n'importe quel moyen, montrez-le nous.

Merci @wyrfel

3
PHearst

Il existe une fonction get_image_send_to_editor() dans wp-admin/includes/media.php qui exécute ceci: apply_filters( 'image_send_to_editor', $html, $id, $caption, $title, $align, $url, $size, $alt );. Essayez d'accrochant ce filtre.

Edit: Aide avec l'appel du filtre ... Votre appel pour raccrocher le rappel ressemblerait à ceci:

add_filter('image_send_to_editor', array(&$MyClassReference, 'filter_iste'), 10, 8);

Le 10 est la priorité, vous devrez peut-être régler cela ... 10 est la valeur par défaut. Votre fonction de filtre doit ressembler beaucoup à ceci:

function filter_iste($html, $id, $caption, $title, $align, $url, $size, $alt) {
    ...
    return $html;
}

Pour obtenir ce que vous devez faire dans le rappel, je commencerais par vider tous les paramètres que vous êtes en train de transmettre à l'écran. Si vous avez besoin de quelque chose de plus, vous pouvez toujours récupérer l'intégralité des données de pièce jointe et des métadonnées à l'aide du $ id que vous avez traversé.

En gros, vous pouvez maintenant essayer deux approches différentes:

  1. Vous vérifiez le type MIME de la pièce jointe et s'il s'agit d'une vidéo, remplacez tout le contenu $ html par votre shortcode. Vous pouvez ajouter aux paramètres de support une option permettant à l’utilisateur de configurer s’il le souhaite ou non. Vous devez seulement accrocher le tout si c'est le cas. Edit: pour vérifier les types de mime vidéo:

    $attachment = get_post($id);
    $mime_type = $attachment->post_mime_type;
    if (substr($mime_type, 0, 5) == 'video' && get_option('use_video_shorty_on_insert')) {
        ...
    }
    
  2. Vous exécutez votre contenu $ html via une expression rationnelle à remplacer pour supprimer les bits dans lesquels le shortcode est encapsulé. La structure de cette expression rationnelle dépend de la nature du contenu $ html. J'irais pour la première option, c'est plus solide et meilleure interface utilisateur. Je comprends que vous souhaitiez donner à l’utilisateur la possibilité de modifier les options de votre shortcode, mais c’est un autre sujet et j’estime qu’il est possible de modifier les champs de la fenêtre contextuelle du média pour y ajouter des options.

Edit 3: exemple complet:

// this seems to be an additional filter running for images only
add_filter('image_send_to_editor', 'my_filter_iste', 20, 8);

function my_filter_iste($html, $id, $caption, $title, $align, $url, $size, $alt) {
    $attachment = get_post($id); //fetching attachment by $id passed through
    $mime_type = $attachment->post_mime_type; //getting the mime-type
    if (substr($mime_type, 0, 5) == 'video') { //checking mime-type
        //if a video one, replace $html by shortcode (assuming $url contains the attachment's file url)
        $html = '[video src="'.$url.'"]';
    }
    return $html; // return new $html
}

Ok ... mauvais filtre, apparemment ... essayez ceci:

// this seems to run when inserting a video via the 'From URL' tab
add_filter('video_send_to_editor_url', 'my_filter_vsteu', 20, 3);

function my_filter_vsteu($html, $href, $title) {
    $html = '[video src="'.$href.'"]';
    return $html;
}

Ahh bien, nous en avons un de plus:

// this seems to run generically for any media item from the 'Upload' tab
add_filter('media_send_to_editor', 'my_filter_mste', 20, 3);

function my_filter_mste($html, $send_id, $attachment) {
    if (substr($attachment->post_mime_type, 0, 5) == 'video') {
        $href = wp_get_attachment_url($attachment->ID);
        $html = '[video src="'.$href.'"]';
    }
    return $html;
}
6
wyrfel

Répondez à ma question

il suffit de changer:

if ($uploadType == 'video') {

à:

if (get_post_mime_type( $id ) == "application/pdf") {
2
Kam D

À propos de la vérification vidéo mime, cela fonctionne:

function my_filter_mste($html, $send_id, $attachment_id) {

global $wpdb;

$postDetails = $wpdb->get_row( $wpdb->prepare("SELECT post_mime_type FROM $wpdb->posts WHERE ID = %s", $send_id) );
$type = explode("/", $postDetails->post_mime_type);
$uploadType = strtolower($type[0]);

if ($uploadType == 'video') {
$href = $attachment_id['url']; 
$html = '[stream flv='.$href.' mp4='.$href.' embed=false share=false width=480 height=360 autostart=false /]';
}
return $html;

J'espère que ça aide!

0
pmqa