如何从插件文件访问WordPress DB

时间:2014-03-07 作者:DLR

我正在构建一个基本的视频管理插件,其中包含一个嵌入功能,该功能将包含类似mysite的URL。com/wp内容/插件/嵌入视频。php?视频=[帖子ID]

我计划使用[POST ID]url参数查询数据库并检索嵌入的相关信息(存储在自定义字段中)。但是,由于文件是直接引用的,所以不会加载WP。

谁能告诉我直接从这个文件加载WordPress(及其DB)的最佳(正确)方法是什么?

我甚至不知道从哪里开始,所以任何帮助或见解都将不胜感激。

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

如果你计划分享/出售你的插件,我强烈建议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 );
}
之后,无论您在哪里需要urlvideo_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 );

结束

相关推荐

由于与WPDB类的外部数据库连接,WordPress页面未发布

我正在开发wordpress plugin 它连接到外部数据库,获取数据,并将其显示在页面/帖子编辑器下方的metabox上。我使用了以下代码:<?php /** MySQL hostname */ define(\'EXT_DB_HOST\', \'localhost\'); /** MySQL database name */ define(\'EXT_DB_NAME\', \'trader\'); /** MySQL database