Benutzerdefinierte Meta-Boxen und Felder für WordPress: Ändern des Verzeichnis-Uploads basierend auf der Benutzer-Bearbeitungsseite

Ich habe dies bereits auf StackOverflow veröffentlicht, aber mir wurde klar, dass es besser wäre, es hier zu posten.

Ich benutze das CMB-Skript (Benutzerdefinierte Meta-Boxen und Felder für WordPress) zum Hochladen von Dateien für verschiedene Benutzer, die die benutzerdefinierte Rolle des cliente .

Ich bin in der Lage, die Felder anzuzeigen und sie funktionieren zu lassen (obwohl sie nur beim Bearbeiten eines Benutzers angezeigt werden und nicht beim Erstellen, aber dies ist für eine andere Frage). Was ich jetzt erreichen möchte, ist das Hochladen von Dateien in verschiedene Ordner für verschiedene Benutzer.

Hier ist der Code:

 // Here we add a new user role, "cliente" add_role( 'cliente', 'Cliente' ); add_filter('wp_handle_upload_prefilter', 'my_upload_prefilter'); add_filter('wp_handle_upload', 'my_upload_postfilter'); function my_upload_prefilter( $file ) { add_filter('upload_dir', 'custom_upload_dir'); return $file; } function my_upload_postfilter( $fileinfo ) { remove_filter('upload_dir', 'custom_upload_dir'); return $fileinfo; } function custom_upload_dir( $path ) { global $pagenow; // Check if we are on the user-edit.php page if ( $pagenow == 'user-edit.php' && isset($_GET['user_id']) ) { // Set the role we want to change the path for $role_to_check = 'cliente'; // Get a bunch of user info for later use $user_id = filter_var( $_GET['user_id'], FILTER_SANITIZE_NUMBER_INT ); $meta = get_user_meta($user_id); $roles = unserialize($meta['wp_capabilities'][0]); // If we are on the chosen role page, set the $customdir to first_name + last_name if ( !empty($roles[$role_to_check]) ) { $customdir = '/' . $meta['first_name'][0] . $meta['last_name'][0]; } } else { // Here we are not on the user-edit.php page. This is just a check to prove that WP is not recognizing the correct page, maybe because we are doing an Ajax call when this function is called. Confusing. $customdir = '/did-not-work'; } // If there is any error, just return the $path and abort the rest. if ( !empty( $path['error'] ) ) { return $path; } // Here we set the new $path with the $customdir set above $path['path'] = str_replace($path['subdir'], '', $path['path']); //remove default subdir (year/month) $path['url'] = str_replace($path['subdir'], '', $path['url']); $path['subdir'] = $customdir; $path['path'] .= $customdir; $path['url'] .= $customdir; return $path; } 

Nach ein paar Überprüfungen scheint es so, als ob mein Code die Benutzer-ID und die in der database gespeicherten Daten abruft, aber beim Hochladen der Bilder erkennt er sie nicht. Könnte das mit der Tatsache zusammenhängen, dass wir Bilder über Ajax oder etwas ähnliches hochladen?

Nur um klar zu sein, ich möchte nicht, dass der Upload auf dem aktuell angemeldeten Benutzer basiert, sondern auf dem Benutzer, den ich als Super-Administrator mit der Seite edit-user.php bearbeite.

Jede Hilfe würde sehr geschätzt werden.

Solutions Collecting From Web of "Benutzerdefinierte Meta-Boxen und Felder für WordPress: Ändern des Verzeichnis-Uploads basierend auf der Benutzer-Bearbeitungsseite"

Ich habe es selbst herausgefunden, also werde ich die Antwort hier posten, bitte beachte, dass die ursprüngliche Antwort auch auf StackOverflow zu finden ist. Wenn sich die Mods so anfühlen, dass sie hier gelöscht werden und nur noch übrig bleiben, dann mach bitte weiter. Ich dachte, es könnte an beiden Orten nützlich sein.

Zuerst der richtige Code, dann eine Erklärung:

 // Here we add a new user role, "cliente". add_role( 'cliente', 'Cliente' ); // These are the filters we need to add in order to modify the default upload path. add_filter('wp_handle_upload_prefilter', 'my_upload_prefilter'); add_filter('wp_handle_upload', 'my_upload_postfilter'); function my_upload_prefilter( $file ) { add_filter('upload_dir', 'custom_upload_dir'); return $file; } function my_upload_postfilter( $fileinfo ) { remove_filter('upload_dir', 'custom_upload_dir'); return $fileinfo; } function custom_upload_dir( $path ) { // When uploading, the file gets sent to upload_async.php, so we need to take the referral page in order to be able to get the user_id we need. We then take the query string, pass it through parse_str and store it in a $query_array. Took me a while to figure it out, but now it works like a charm. $actual_page = $_SERVER['HTTP_REFERER']; parse_str( parse_url($actual_page, PHP_URL_QUERY), $query_array ); // Check if we are uploading from the user-edit.php page. if ( strpos($actual_page, 'user-edit.php') ) { // Set the role we want to change the path for. $role_to_check = 'cliente'; // Get a bunch of user info for later use $user_id = filter_var( $query_array['user_id'], FILTER_SANITIZE_NUMBER_INT ); $meta = get_user_meta( $user_id ); $roles = unserialize( $meta['wp_capabilities'][0] ); // If we are on the chosen role page, set the $customdir to first_name + last_name if ( !empty($roles[$role_to_check]) ) { $customdir = '/docs/' . $meta['first_name'][0] . $meta['last_name'][0]; // If there is any error, just return the $path and abort the rest. if ( !empty( $path['error'] ) ) { return $path; } // Here we set the new $path with the $customdir set above $new_subdir = $customdir . $path['subdir']; $path['path'] = str_replace( $path['subdir'], $new_subdir, $path['path'] ); $path['url'] = str_replace( $path['subdir'], $new_subdir, $path['url'] ); $path['subdir'] = $new_subdir; return $path; } } else { // We are not uploading from user-edit.php, so go ahead as per default. return $path; } } 

Das Problem war, dass $pagenow beim Hochladen über Ajax die Seite async-upload.php $pagenow korrekt speichert und nicht die URL, in der wir uns befinden. Ich musste einfach die Empfehlungsseite über php $_SERVER['HTTP_REFERER'] (bitte, Beachten Sie, dass der referer Typo wegen eines Legacy Tipperrorss in der http Spec, witzigen Sachen, da ist.

Bitte beachten Sie auch, dass die PHP-Spezifikationen die Verwendung von HTTP_REFERER da dies zu unerwarteten Ergebnissen aufgrund von Serverkonfigurationen führen kann. In diesem Fall sollte ich jedoch die volle Kontrolle über den Server haben. Dies sollte kein Problem darstellen. Wenn Sie auf ein Problem stoßen, würde ich vorschlagen, das zu überprüfen.

Sobald ich die richtige URL habe, kann ich es analysieren und überprüfen, ob wir in der user-edit.php sind. Wenn user-edit.php , holen wir die user_id aus der user_id und fahren von dort fort.

Ich brauchte eine Weile, um es herauszufinden, aber im Nachhinein war es ziemlich einfach.

Hoffe es hilft jemand anderem in der Zukunft.