web-dev-qa-db-fra.com

renommer les pièces jointes en fonction du post-titre du parent lors du téléchargement

Je sais que certaines fonctions sont déjà disponibles pour cette tâche, mais aucune ne semble fonctionner aussi longtemps que nécessaire.

Le meilleur moyen me semble d’ajouter un filtre àwp_handle_upload_prefilterlike kaiser ne dans cet exemple . Malheureusement, le fichier n’obtient le titre-post-parent que si la publication est déjà enregistrée dans la base de données.


Une autre approche consiste à ajouter une fonction àadd_attachmentcomme Ijaas fait ici . Ensuite, le fichier reçoit le nom du post-titre parent, mais aucune vignette n'est créée. Et ma tentative en utilisant wp_generate_attachment_metadata (); pour créer les tailles d'image manquantes, terminées par une boucle infinie (probablement parce que je ne l'utilise pas correctement, mais maintenant, je suis un peu effrayé par cette fonction).


Ce serait bien s'il y avait un moyen de passer le titre àwp_handle_upload_prefiltermême si le message n'est pas encore enregistré.

Oh, au fait, c’est ma fonction sans fin, peut-être que quelqu'un pourra me dire ce qui ne va pas.N'UTILISEZ PAS CETTE FONCTION !!!

add_action('add_attachment', 'fkp_rename_attacment');
function fkp_rename_attacment($post_ID){

  $post = get_post($post_ID);
  $file = get_attached_file($post_ID);
  $path = pathinfo($file);
  $parent = get_post($post->post_parent);
  $p_author = get_the_author_meta( 'display_name', $parent->post_author );
  $p_author_san = sanitize_title($p_author);

  $newfilename = $parent->post_name . '-' . $p_author_san . '-' . $post_ID;
  $newfile = $path['dirname']."/".$newfilename.".".$path['extension'];

  rename($file, $newfile);    

  $wp_filetype = wp_check_filetype(basename($newfile), null );
  $wp_upload_dir = wp_upload_dir();
  $attachment = array(
    'guid' => $wp_upload_dir['url'] . '/' . basename( $newfile ), 
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($newfile)),
    'post_content' => '',
    'post_status' => 'inherit'
   );
  $attach_id = wp_insert_attachment( $attachment, $newfile, $parent->ID );
  require_once(ABSPATH . 'wp-admin/includes/image.php');
  $attach_data = wp_generate_attachment_metadata( $attach_id, $newfile );
  wp_update_attachment_metadata( $attach_id, $attach_data );
}

N'UTILISEZ PAS CETTE FONCTION !!!

2
schwarzgrau

Après avoir essayé d’ajouter une fonction à publish_post et créé beaucoup de fichiers inutiles, j’ai essayé d’endommager kaisers function pour répondre à mes besoins.

function modify_uploaded_file_names( $image ) {
    // Use part of the post or user object to rename the image
    get_currentuserinfo();
    global $post, $current_user;

    // only do this if we got the post id, 
    // otherwise they're probably in the media section 
    // rather than uploading an image from a post
    if ( isset( $_REQUEST['post_id'] ) ) {
        // get the ID
        $post_id  = absint( $_REQUEST['post_id'] );

        // get the post OBJECT
        $post_obj  = get_post( $post_id );

        // get the post slug
        $post_slug = sanitize_title($post_obj->post_title); 

        // get the author
        $author = sanitize_title( get_the_author_meta( 'display_name', $post_obj->post_author ) );

        switch( $image['type'] ) {
            case 'image/jpeg' :
                $suffix = 'jpg';
                break;

            case 'image/png' :
                $suffix = 'png';
                break;

            case 'image/gif' :
                $suffix = 'gif';
                break;
        }

        // if we found a slug
        if ( $post_slug ) 
            $image['name'] = "{$author}-{$post_slug}-{$random_number}.{$suffix}";
    }
    else {
        $image_name    = str_place( ' ', '-', strtolower( $current_user->data->user_nicename ) );
        $image['name'] = $image_name . '-' . $file['name'];
    }

    return $image;
}

// Only one arg, so 4th attr not needed - Priority set to later 20
add_filter( 'wp_handle_upload_prefilter', 'my_modify_uploaded_file_names', 20 );

Il n'y a que quelques petits changements

  1. $post_obj->post_name remplacé par sanitize_title($post_obj->post_title) puisque post_name uniquement était présent dans mes tests lorsque la publication était déjà enregistrée.
  2. supprimé les nombres aléatoires, car wp_handle_upload utilise wp_unique_filename () anyway.
  3. Ajout du nom de l'auteur au nom du fichier, mais c'est juste quelque chose dont j'ai besoin.
0
schwarzgrau