如果你计划分享/出售你的插件,我强烈建议don\'t 直接加载插件。
因为要加载WordPress,需要加载引导文件,即/wp-load.php
所以,你应该embed-video.php
类似于:
require \'/wordpress/path/wp-load.php\';
你注意到这里的问题了吗?这个
/wordpress/path/
对于不同的用户,部分是不同的,而且,实际上,即使您使用
require dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . \'/wp-load.php\';
这还不够,因为wp\\U内容文件夹和/或插件文件夹可以从标准位置移动,所以您永远无法确定它们在哪里。
如果您只为自己编写插件,您可以这样做,因为您知道文件所在的位置,只需确保使用灵活的方式定义路径,因为即使您以后也可能需要移动文件夹。
如果您正在编写插件以共享/销售,则需要使用其他插件。
一种是将请求发送到admin-ajax.php
并使用ajax api。我知道您认为您的请求不是ajax,但这不是问题:任何ajax请求都只是http请求,因此即使您发送一个;“正常”;获取请求。
示例代码:
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\' );
});
前面的代码仅在需要时添加操作,从而加快所有其他请求的速度,因为
\'plugins_loaded\'
每个请求都会触发挂钩。
现在添加action函数,您将在其中放置逻辑:
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();
}
将以前的代码添加到插件中,可以使用函数轻松生成正确的URL:
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 );
}
之后,无论您在哪里需要url
video_embed_url( $id )
将回显url(例如在html标记中)
get_video_embed_url( $id )
将返回要在代码中使用的url。
URL将类似于
mysite.com/wp-admin/admin_ajax.php?action=embed_video&video={$videoid}
此代码似乎超出了您的需要,但:
它使用最佳实践,并允许您共享/销售您的插件。它是使用ajax api开发的,即使现在您不使用ajax,将来您也可以放心使用它,在这种情况下,您无需做任何事情:您的插件已经准备好了。一个窍门:小心使用,或者完全不要使用它,就像前面所说的,当您只为自己编写代码时,您可以考虑直接加载插件文件。我还说过,最好使用灵活的方式来定义路径。这是一个如何灵活定义它们的示例:根本不定义,而是传入url:
/* 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 );
}
}
前一个函数将返回如下内容
mysite.com/wp-content/plugins/myplugin/embed-video.php?path=L3Zhci93d3cvd29yZHByZXNzL3dwLWxvYWQucGhw&video=123
使用此功能输出嵌入的视频(如果需要在帖子内容中使用url,请使用快捷码)。
这样做,在embed-video.php
您可以:
$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 );