Komponenten in Themes und Plugins: Wie bekomme ich die URL?

In meinen Projekten habe ich einige Komponenten, die ich in vielen benutzerdefinierten Plugins sowie in einigen benutzerdefinierten Themen wie zB Admin-Bild oder Video-Selektoren verwende.

Diejenigen, die ich in benutzerdefinierten Git-Repositories halte. Da diese Komponenten jedoch sowohl in Themes als auch in Plugins verwendet werden, muss ich die URL-Getter nach dem Ziehen aus GIT immer manuell ändern. Wenn die Komponenten mehrfach vorhanden sind, ist das kein Problem. Ich habe diese mit function_exists eingepackt.

Dies ist, was ich im Thema verwende:

 wp_enqueue_script(get_template_directory_uri().'/libs/my_lib/admin_image_upload', ...); 

Das verwende ich in einem Plugin:

 wp_enqueue_script(plugins_url(__FILE__).'admin_image_upload.js', ...); 

Gibt es eine Möglichkeit zu bestimmen, ob meine aktuelle PHP-Datei im Plugins-Ordner oder im Themes-Ordner liegt, damit ich mich automatisch für den richtigen Pfad entscheiden kann?

Solutions Collecting From Web of "Komponenten in Themes und Plugins: Wie bekomme ich die URL?"

Gibt es eine Möglichkeit, festzustellen, ob meine aktuelle PHP-Datei im Plugins-Ordner oder im Themes-Ordner liegt?

Im __FILE__ haben Sie immer den Pfad zur aktuellen Datei ( __FILE__ ), so dass Sie ihn immer nach __FILE__ und mit dem Kontext vergleichen können. Dies könnte in der benutzerdefinierten Site gut genug sein, aber wahrscheinlich zu spröde für den öffentlichen Code. Es gibt viele Randfälle mit Pfaden, da sie stark angepasst werden können.

Was Sie haben, ist nicht nur Asset- Problem, sondern Abhängigkeitsproblem – wie verwenden Sie mehrere Komponenten auf unterschiedliche Weise und ohne Konflikte.

Persönlich würde ich ernsthaft in den Composer schauen, da es de facto ist, Abhängigkeiten in modernen PHP zu verwalten. Es ist … nicht perfekt für Eigenheiten von öffentlich verteilten WP-Erweiterungen, aber Ihr Fall klingt eher wie benutzerdefinierte Arbeit konzentriert.

Hier ist eine Lösung, die die URL in eine Datei relativ zu ihrem Standort zurückgibt, sowie eine Zeichenfolge, die angibt, wo die Datei lebt, dh mu-plugins / plugins / theme.

Dieser Code wurde von get_url_from_dir() in der Metabox- Bibliothek CMB2 übernommen .

 /** * Converts a system file path to a URL. * Returns URL and the detected location of the file. * * Based on get_url_from_dir() via CMB2 * @link https://github.com/CMB2/CMB2 * * @param string $file file path to convert. * @return string Converted URL. * @return array|bool (on error) * array * $url string Converted URL. * $location string location of dir (mu-plugins, plugins, theme) * */ function wpse_get_url_info_from_file( $file ) { $file = wp_normalize_path( $file ); $test_dir = pathinfo( $file ); if ( ! $test_dir ) { return false; } $test_dir = trailingslashit( $test_dir['dirname'] ); // Test if we are in the mu-plugins dir. if ( 0 === strpos( $test_dir, wp_normalize_path( WPMU_PLUGIN_DIR ) ) ) { return [ 'url' => trailingslashit( plugins_url( '', $file ) ), 'location' => 'mu-plugins' ]; } // Test if we are in the plugins dir. if ( 0 === strpos( $test_dir, wp_normalize_path( WP_PLUGIN_DIR ) ) ) { return [ 'url' => trailingslashit( plugins_url( '', $file ) ), 'location' => 'plugins' ]; } // Now let's test if we are in the theme dir. $theme_root = wp_normalize_path( get_theme_root() ); if ( 0 === strpos( $file, $theme_root ) ) { // Ok, then use get_theme_root_uri. $url = set_url_scheme( trailingslashit( str_replace( untrailingslashit( $theme_root ), untrailingslashit( get_theme_root_uri() ), $test_dir ) ) ); return [ 'url' => $url, 'location' => 'theme' ]; } } 

Wenn wir beispielsweise ein plugins-directory/wpse in namens wpse living in plugins-directory/wpse und ein Theme namens my-theme , können wir den folgenden Code im Plugin oder im Theme verwenden, um die Datei admin_image_upload.js in die admin_image_upload.js einzureihen Verzeichnisse im Plugin und Theme.

 add_action( 'wp_enqueue_scripts', 'wpse_enqueue_js_based_on_location' ); function wpse_enqueue_js_based_on_location() { $url_info = wpse_get_url_info_from_file( __FILE__ ); //exit ( print_r( $url_info ) ); // Bail if something is wrong. if ( ! $url_info ) { return; } // Bail if something is wrong. if ( ! isset( $url_info['url'] ) || ! isset( $url_info['location'] ) ) { return; } // Enqueue the JS based on detected location of the file. if ( 'plugins' === $url_info['location'] ) { wp_enqueue_script( 'wpse-js', plugins_url( '/admin_image_upload.js', __FILE__ ) ); } elseif ( 'theme' === $url_info['location'] ) { wp_enqueue_script( 'wpse-js', get_template_directory_uri() . '/libs/my_lib/admin_image_upload.js' ); } } 

Wenn Sie den obigen Code aus einer Datei im Root-Verzeichnis des wpse Plugins verwenden, $url_info aus:

 Array( [url] => http://example.com/wp-content/plugins/wpse/ [location] => plugins ) 

Wenn wir denselben Code innerhalb der functions.php eines Themes $url_info , sieht $url_info aus:

 Array( [url] => http://example.com/wp-content/themes/my-theme/ [location] => theme )