如何从 Artisan 命令访问 WordPress 功能
How to Access WordPress functions from Artisan Command
我在 Laravel 上使用 WordPress 时遵循了这个 tutorial 并且我能够从我的 Laravel 控制器访问 WordPress 功能。
基本示例
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Corcel;
class WordPressController extends Controller
{
public function getIndex ()
{
return redirect('/');
$posts = get_posts([
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'post_title',
]);
return $posts;
}
这很有效,而且我已经能够访问到目前为止我尝试过的所有 WordPress 方法。
问题
我被卡住的地方是当我创建并注册一个新的 artisan 命令并尝试从那里访问那些相同的方法时。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Http\Request;
use App\Http\Requests;
class WPTags extends Command
{
protected $signature = 'wp:tags';
protected $description = 'Output tags from WordPress';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$tags = get_tags([
'number'=>20,
'offset' => 10,
'hide_empty' => true,
]);
return $tags;
}
据我所知,Laravel 5 通过 index.php 文件导入 WordPress 方法的方式存在问题。我想我需要做一些自动加载的事情,但我迷路了。我尝试在 artisan 命令文件构造函数中重复 index.php 文件中的步骤。
我唯一能想到的其他(hacky)事情是将控制器导入我的 artisan 命令,但我真的不想那样做。
更新
接受的答案是要走的路。您会 运行 了解一些内容。您会收到一些与未在客户端中设置的 $_SERVER
变量相关的错误。这是我用来 suppress/deal 这些错误的代码。
它并不完美,但对于本地开发来说,这至少应该可以提高您的工作效率。
//assumes you're using localhost as your base url
$_SERVER['HTTP_HOST'] = "localhost";
$_SERVER['SERVER_PROTOCOL'] = "HTTP/1.1";
if (!isset($_SERVER['REQUEST_METHOD'])) {
$_SERVER['REQUEST_METHOD'] = "GET";
}
if (!isset($_POST['action'])) {
$_POST['action'] = "undefined";
}
define('WP_USE_THEMES', false);
require __DIR__."/../public/wordpress/wp-blog-header.php";
我认为这部分
连接 Laravel 到 Wordpress
define('WP_USE_THEMES', false);
require __DIR__."/../public/wordpress/wp-blog-header.php";
放在 app.php
中要好得多,因为每次调用 laravel 时都会打开此文件:网络、控制台等。这没有经过测试,但我认为应该可以。
另一种我认为更好的方法是将此文件包含到作曲家自动加载器中,但您不能在那里定义常量。
我在 Laravel 上使用 WordPress 时遵循了这个 tutorial 并且我能够从我的 Laravel 控制器访问 WordPress 功能。
基本示例
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Corcel;
class WordPressController extends Controller
{
public function getIndex ()
{
return redirect('/');
$posts = get_posts([
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'post_title',
]);
return $posts;
}
这很有效,而且我已经能够访问到目前为止我尝试过的所有 WordPress 方法。
问题
我被卡住的地方是当我创建并注册一个新的 artisan 命令并尝试从那里访问那些相同的方法时。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Http\Request;
use App\Http\Requests;
class WPTags extends Command
{
protected $signature = 'wp:tags';
protected $description = 'Output tags from WordPress';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$tags = get_tags([
'number'=>20,
'offset' => 10,
'hide_empty' => true,
]);
return $tags;
}
据我所知,Laravel 5 通过 index.php 文件导入 WordPress 方法的方式存在问题。我想我需要做一些自动加载的事情,但我迷路了。我尝试在 artisan 命令文件构造函数中重复 index.php 文件中的步骤。
我唯一能想到的其他(hacky)事情是将控制器导入我的 artisan 命令,但我真的不想那样做。
更新
接受的答案是要走的路。您会 运行 了解一些内容。您会收到一些与未在客户端中设置的 $_SERVER
变量相关的错误。这是我用来 suppress/deal 这些错误的代码。
它并不完美,但对于本地开发来说,这至少应该可以提高您的工作效率。
//assumes you're using localhost as your base url
$_SERVER['HTTP_HOST'] = "localhost";
$_SERVER['SERVER_PROTOCOL'] = "HTTP/1.1";
if (!isset($_SERVER['REQUEST_METHOD'])) {
$_SERVER['REQUEST_METHOD'] = "GET";
}
if (!isset($_POST['action'])) {
$_POST['action'] = "undefined";
}
define('WP_USE_THEMES', false);
require __DIR__."/../public/wordpress/wp-blog-header.php";
我认为这部分
连接 Laravel 到 Wordpress
define('WP_USE_THEMES', false);
require __DIR__."/../public/wordpress/wp-blog-header.php";
放在 app.php
中要好得多,因为每次调用 laravel 时都会打开此文件:网络、控制台等。这没有经过测试,但我认为应该可以。
另一种我认为更好的方法是将此文件包含到作曲家自动加载器中,但您不能在那里定义常量。