【问题标题】:How to Access WordPress functions from Artisan Command如何从 Artisan Command 访问 WordPress 功能
【发布时间】:2015-12-08 08:47:55
【问题描述】:

我遵循了tutorial 将 WordPress 与 Laravel 结合使用,并且能够从我的 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 方法。

问题

当我创建并注册一个新的工匠命令并尝试从那里访问这些相同的方法时,我会遇到困难。

<?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 方法的方式存在问题。我想我需要对自动加载做点什么,但我迷路了。我尝试重复在我的工匠命令文件构造函数中的 index.php 文件中采取的步骤。

我能想到的唯一其他(hacky)事情是将控制器导入到我的工匠命令中,但我真的不想那样做。

更新

接受的答案是要走的路。你会遇到一些事情。您将收到一些与未在客户端中设置的 $_SERVER 变量相关的错误。这是我用来抑制/处理这些错误的代码。

这并不完美,但对于本地开发而言,这至少应该让您高效。

//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";

【问题讨论】:

  • 我不熟悉这个话题,所以这可能是一个愚蠢的问题,但我会问它以防万一。在您的第一个工作示例中,您在顶部导入 Corcel。这不是允许您使用 WordPress 功能的原因吗?如果是这样,您不应该在 Artisan 命令中也重视这一点吗?
  • 根本不是一个愚蠢的问题,我实际上只是早些时候尝试过,但它不起作用,但我没有正确导入插件。一旦我开始单独导入每个类,它现在就可以工作了。所以use Corcel 变成use Corcel\Posts 等等...
  • 更重要的是,它确实提供了一个访问 WordPress 的界面,但它不能让我直接访问 WordPress 的方法,而这正是我真正想要的。

标签: php wordpress laravel laravel-5 laravel-artisan


【解决方案1】:

我认为这部分

将 Laravel 连接到 Wordpress

define('WP_USE_THEMES', false);
require __DIR__."/../public/wordpress/wp-blog-header.php";

最好放在app.php 中,因为这个文件在每次调用 laravel 时都会打开:web、console 等等。这未经测试,但我认为应该可以。

另一种我认为更好的方法是将这个文件包含到作曲家自动加载器中,但是你不能定义常量。

【讨论】:

  • 是的,但是如果我能够在自动加载 wp-blog-header.php 之前设法定义常量,可能会有一个策略。我会对此进行试验,然后再报告。
  • 感谢您接受我的回答 - 哪一个是正确的?在 bootstrap/app.php 中包含这部分还是?
  • 将它放在bootstrap/app.php 中对上述修复效果很好。自动加载产生了很多错误,以至于我没有费心去让它工作。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 2018-07-15
相关资源
最近更新 更多