Wie man von einer Plugin-Datei auf die WordPress-DB zugreift

Ich erstelle ein einfaches Videomanagement-Plugin mit einer Einbettungsfunktion, die URLs wie: mysite.com/wp-content/plugins/embed-video.php?video=[POST ID] enthält.

Ich plane, den URL-Parameter [POST ID] zu verwenden, um die database abzufragen und die relevanten Informationen für die Embeds abzurufen (gespeichert in benutzerdefinierten Feldern). Da die Datei jedoch direkt referenziert wird, wird WP nicht geladen.

Könnte mir jemand sagen, was der beste (und korrekte) Weg wäre, WordPress (und seine DB) direkt aus dieser Datei zu laden?

Ich weiß nicht einmal, wo ich damit anfangen soll, also würde jede Hilfe oder Einsicht sehr geschätzt werden.

Solutions Collecting From Web of "Wie man von einer Plugin-Datei auf die WordPress-DB zugreift"

Wenn Sie planen, Ihr Plugin zu teilen / verkaufen, empfehle ich dringend, Ihr Plugin nicht direkt zu laden.

Da, um WordPress zu laden, du die Bootstrap-Datei laden musst, also /wp-load.php , solltest du deine embed-video.php etwas wie embed-video.php :

 require '/wordpress/path/wp-load.php'; 

Bemerken Sie das Problem hier? Das /wordpress/path/ Teil ist für Benutzer zu Benutzer unterschiedlich, und wirklich, selbst wenn Sie etwas wie verwenden

 require dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/wp-load.php'; 

Es ist nicht genug, weil der Ordner wp_content und / oder der Ordner plugins von der Standardposition verschoben werden können, so dass Sie nie sicher sein können, wo sie sich befinden.

Wenn Sie ein Plugin nur für sich selbst schreiben, können Sie es tun, weil Sie wissen, wo sich Ihre Dateien befinden. Verwenden Sie nur eine flexible Methode, um den Pfad zu definieren, denn selbst Sie können Ihre Ordner in Zukunft verschieben.

Wenn Sie ein Plugin zum Teilen / Verkaufen schreiben, müssen Sie eine Alternative verwenden.

Eine besteht darin, Anfragen an admin-ajax.php zu senden und die ajax api zu verwenden. Ich weiß, dass Sie denken, dass Ihre Anfrage kein Ajax ist, aber das ist kein Problem: Jede Ajax-Anfrage ist nur eine HTTP-Anfrage, also wird es auch funktionieren, wenn Sie eine “normale” GET-Anfrage senden.

Beispielcode:

 add_action( 'plugins_loaded', function() { /* once we use ajax api we can check if DOING_AJAX is set even if we are not really doing ajax that will reduce the times we perform code, speeding up you others requests */ if ( ! defined('DOING_AJAX') ) return; /* check if the url contain the GET argument 'action' set to 'embedvideo' and contain the video id in the argument 'video' if not do nothing */ $action = filter_input( INPUT_GET, 'action', FILTER_SANITIZE_STRING ); $embed = (int) filter_input( INPUT_GET, 'video', FILTER_SANITIZE_NUMBER_INT ); if ( $action === 'embed_video' || ! $embed > 0 ) return; /* add the ajax action for logged and not logged users */ add_action( "wp_ajax_{$action}", 'video_request' ); add_action( "wp_ajax_nopriv_{$action}", 'video_request' ); }); 

Vorheriger Code fügt die Aktion nur bei Bedarf hinzu und beschleunigt dadurch alle anderen Anfragen, da 'plugins_loaded' Hooks für jede Anfrage ausgetriggers wird.

Fügen Sie nun die Aktionsfunktion hinzu, in die Sie die Logik einfügen:

 function video_request() { /* check if the url contain a video id in the GET argument 'video' if not do nothing */ $video = (int) filter_input( INPUT_GET, 'video', FILTER_VALIDATE_NUMBER_INT ); if ( ! $video > 0 ) return; /* your post ID is in $video variable and you have WordPress available */ $post = get_post( $video ); // do stuff /* must exit(), because even not sended via ajax, we use ajax api that require to exit */ exit(); } 

Wenn Sie Ihrem Plugin vorherigen Code hinzufügen, können Sie eine function verwenden, um einfach die richtigen URLs zu generieren:

 function get_video_embed_url( $videoid = NULL ) { if ( is_numeric( $videoid ) && (int) $postid > 0 ) { $args = array( 'action' => 'embed_video', 'video' => $postid ); return add_query_arg( $args, admin_url( 'admin_ajax.php' ); } return '#'; } function video_embed_url( $videoid = NULL ) { echo get_video_embed_url( $videoid ); } 

Danach gibt die URL video_embed_url( $id ) die URL zurück (zB in HTML-Markup). get_video_embed_url( $id ) gibt die URL zurück, die im Code verwendet werden soll.

Die URLs werden so ähnlich sein

 mysite.com/wp-admin/admin_ajax.php?action=embed_video&video={$videoid} 

Dieser Code kann mehr als Sie brauchen, aber:

  • Es nutzt Best Practices und ermöglicht es Ihnen, Ihr Plugin zu teilen / verkaufen
  • es ist mit ajax api entwickelt, und selbst wenn Sie jetzt nicht ajax verwenden, können Sie es in Zukunft verwenden, und in diesem Fall müssen Sie nichts tun: Ihr Plugin ist fertig

Ein Trick: Benutze es mit Vorsicht oder benutze es überhaupt nicht

Wie gesagt, wenn Sie Code nur für sich selbst schreiben, können Sie daran denken, Ihre Plugin-Datei direkt zu laden. Und ich sagte auch, dass man einen flexibleren Weg zu definierten Pfaden besser nutzen sollte. Dies ist ein Beispiel dafür, wie Sie diese flexibel definieren können: nicht definieren, sondern die URL übergeben:

 /* in main plugin file, that I suppose to be in the same folder of embed-video.php */ function my_embed_url( $id ) { if ( is_numeric( $id ) && $id > 0 ) { $base = plugins_url( '/embed-video.php', __FILE__ ); $path = urlencode( base64_encode( trailingslashit( ABSTPATH ) . 'wp-load.php' ) ); return add_aquery_arg( array( 'path' => $path, 'video' => $id ), $base ); } } 

Die vorherige function gibt etwas zurück wie mysite.com/wp-content/plugins/myplugin/embed-video.php?path=L3Zhci93d3cvd29yZHByZXNzL3dwLWxvYWQucGhw&video=123 Verwenden Sie diese function, um das eingebettete Video auszugeben (wenn Sie URL im Post-Inhalt verwenden müssen, verwenden Sie einen Shortcode ).

In den ersten Zeilen von embed-video.php Sie:

 $raw = filter_input( INPUT_GET, 'path', FILTER_SANITIZE_STRING ); $videoid = (int) filter_input( INPUT_GET, 'video', FILTER_SANITIZE_NUMBER_INT ); if ( empty($raw) || empty($videoid) || ! $videoid > 0 ) exit(); $path = urldecode( base64_decode( $raw ) ); if ( ! file_exists( $path ) ) exit(); define( 'SHORTINIT', 1 ); // this allow you to load only minimun WP environment require_once $path; /* WordPress is available */ $post = get_post( $videoid );