Simple integration of Yii directly into WordPress.
init
callback has been run in WordPress using Yii::app()
or Yii::foobar
The following Yii components are pre-configured to work in your WordPress:
Yii::app()->assetManager
-
CAssetManager
Yii::app()->clientScript
-
CClientScript
Yii::app()->controller
-
CController
Yii::app()->db
-
CDbConnection
Yii::app()->errorHandler
-
CErrorHandler
Yii::app()->session
-
CHttpSession
Yii::app()->urlManager
-
CUrlManager
// TODO
Download the
latest release or
development version and uncompress the
wp-content/plugins
folder into your wordpress.
The application has been tested with the following software versions, however should work with any minor revision change:
wp-content/plugins/yii-embed-wordpress/yii
folder. The
yii.php
file should be in
wp-content/plugins/yii-embed-wordpress/yii/framework/yii.php
. Alternatively you can use the built-in download manager to install Yii.
Browse to the plugin manager in the WordPress admin, then press Activate next to Yii Embed.
If Yii was not found you will be prompted to perform an Automatic Download or a Manual Download.
You can use an alternative path to Yii by browsing to the Yii Embed section under the WordPress admin Settings page.
Search Engine Friendly permalinks must be enabled, see this page for instructions.
...
In this example we will create a WordPress plugin called Foo. It will contain a controller called FooBarController with basic functionality.
wp-content/plugins/foo/ -- folder containing your plugin foo.php -- the plugin loader includes/ -- wordpress helper classes Foo.php -- main static helper class FooAdmin.php -- admin static helper class FooSettings.php -- admin options page app/ -- yii application assets/ -- assets folder css/ -- stylesheet files foo_admin.css -- front end stylesheet foo_front.css -- front end stylesheet img/ -- image files js/ -- javascript files components/ -- application components (auto loaded) FooController.php -- base controller controllers/ -- controller classes FooBarController.php -- example controller models/ -- model classes FooBar.php -- example model views/ -- view files fooBar/ -- view files for FooBarController _form.php -- form partial _view.php -- view partial admin.php -- admin page create.php -- create page index.php -- front page update.php -- update page view.php -- view page
CREATE TABLE `wp_foo_bar` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `description` text NOT NULL, PRIMARY KEY (`id`) );
wp-content/plugins/foo/foo.php
<?php /** * Plugin Name: Foo */ // do not allow direct entry here if (!function_exists('wp')) { echo 'cannot be called directly'; exit; } // define constants define('FOO_URL', plugin_dir_url(__FILE__)); define('FOO_PATH', __DIR__ . '/'); // load plugin require_once(FOO_PATH . 'includes/Foo.php'); Foo::init();
wp-content/plugins/foo/includes/Foo.php
<?php /** * Foo is the static helper class for Foo Plugin functionality. */ class Foo { /** * Initialize Foo */ public static function init() { // load language load_plugin_textdomain('foo', false, basename(FOO_PATH) . '/languages'); // runs when plugin is activated register_activation_hook(FOO_PATH . 'foo.php', 'Foo::activation'); // runs on plugin deactivation register_deactivation_hook(FOO_PATH . 'foo.php', 'Foo::deactivation'); // setup admin pages if (is_admin()) { require_once(FOO_PATH . 'includes/FooAdmin.php'); FooAdmin::init(); } // init Yii add_action('init', 'Foo::yiiInit'); } /** * Callback when the plugin is activated */ public static function activation() { // add options delete_option('foo'); add_option('foo', array( 'dummy' => '', )); } /** * Callback when the plugin is deactivated */ public static function deactivation() { // delete options delete_option('foo'); } /** * Initialize Yii */ public static function yiiInit() { // only run if Yii was found if (!defined('YII_EMBED_YII_VERSION') || !YII_EMBED_YII_VERSION) return; // setup aliases Yii::setPathOfAlias('foo', FOO_PATH . 'app'); Yii::import('foo.components.*'); Yii::import('foo.models.*'); // setup controller map foreach (glob(Yii::getPathOfAlias('foo.controllers') . '/*') as $controller) { Yii::app()->controllerMap[lcfirst(str_replace('Controller.php', '', basename($controller)))] = strtr($controller, array(FOO_PATH . 'app' => 'foo', '.php' => '', '/' => '.', '\\' => '.')); } // setup custom routes Yii::app()->urlManager->rules['bar/<action:(\w+)>*'] = 'fooBar/<action>'; Yii::app()->urlManager->rules['bar'] = 'fooBar/index'; Yii::app()->urlManager->init(); // register scripts self::registerScripts(); } /** * Registers the css and js scripts * @return string */ public static function registerScripts() { // only run if Yii was found if (!defined('YII_EMBED_YII_VERSION') || !YII_EMBED_YII_VERSION) return; // register css/js files if (is_admin()) { Yii::app()->clientScript->registerCssFile(self::assetsUrl() . '/css/foo_admin.css'); } else { Yii::app()->clientScript->registerCssFile(self::assetsUrl() . '/css/foo_front.css'); } } /** * Returns the assets url * @return string */ public static function assetsUrl() { static $assetsUrl; if ($assetsUrl !== null) return $assetsUrl; // only run if Yii was found if (!defined('YII_EMBED_YII_VERSION') || !YII_EMBED_YII_VERSION) return $assetsUrl = false; // publish the assets return $assetsUrl = Yii::app()->assetManager->publish(Yii::getPathOfAlias('foo.assets'), true, -1, YII_DEBUG); } }
wp-content/plugins/foo/includes/FooAdmin.php
<?php /** * FooAdmin is the static helper class for Foo Plugin administration functionality. */ class FooAdmin { /** * Initialize the Admin callbacks and messages. */ public static function init() { // add action for notices add_action('foo_admin_notice', 'FooAdmin::notice', 10, 2); // check if yii-embed is installed add_action('init', 'FooAdmin::yiiEmbedCheck'); // add admin menu pages add_action('admin_menu', 'FooAdmin::menu'); // register settings page require_once(FOO_PATH . 'includes/FooSettings.php'); new FooSettings(); } /** * Callback to and menus and pages. * Admin page format is: yii_embed_[controller]_[action] */ public static function menu() { // add page for FooBarController::actionAdmin() add_menu_page(__('Foo'), __('Foo'), 'administrator', 'yii_embed_fooBar_admin', 'YiiEmbedAdmin::page'); if (isset($_GET['page']) && strpos($_GET['page'], 'yii_embed_fooBar_') === 0) { add_submenu_page('yii_embed_fooBar_admin', '', '', 'administrator', $_GET['page'], 'YiiEmbedAdmin::page'); } } /** * Callback for foo_admin_notice. * * Example: * do_action('foo_admin_notice', __('<p>Hello world!</p>')); * do_action('foo_admin_notice', __('<p>An error occurred.</p>'), 'error'); * * @param string $message HTML message to display on the admin page. * @param string $class CSS class to wrap the message in, either "updated" or "error". */ public static function notice($message, $class = 'updated') { add_action('admin_notices', create_function('', 'echo \'<div class="' . addslashes($class) . '">' . str_replace("'", "\\'", $message) . '</div>\';')); } /** * Callback to see if yii-embed is installed. */ public static function yiiEmbedCheck() { if (!defined('YII_EMBED_VERSION')) { $message = strtr(__('<p><b>Could not find Yii Embed plugin!</b><br/>Download it using the button below and move it into your <b>wp-content/plugins</b> folder, then visit the <a href=":plugins_href"><strong>Plugins</strong></a> page to enable it:</p><p>:download</p>'), array( ':settings_href' => get_admin_url() . 'admin.php?page=yii_embed_settings', ':download' => '<a href="https://github.com/cornernote/yii-embed-wordpress/archive/master.zip" class="button-primary">' . __('Download Yii Embed') . '</a>', )); do_action('foo_admin_notice', $message, 'error'); } } }
wp-content/plugins/foo/includes/FooSettings.php
<?php /** * FooSettings manages the setup and callbacks for the administration options page. */ class FooSettings { /** * @var array values to be used in the fields callbacks. */ private $options; /** * Add callbacks to add admin menu and setup options form. */ public function __construct() { // add admin menu add_action('admin_menu', array($this, 'admin_menu')); // setup options form add_action('admin_init', array($this, 'admin_init')); } /** * Callback to add the admin menu page under "WPAdmin > Settings". */ public function admin_menu() { // add options page to the menu add_options_page(__('Foo Settings'), __('Foo'), 'manage_options', 'foo_settings', array($this, 'options_page')); } /** * Callback to register and add sections and settings */ public function admin_init() { // register the setting and validation callback register_setting('foo', 'foo', array($this, 'validate')); // add the settings section add_settings_section('foo', '', array($this, 'settings_section_foo'), 'foo_settings'); // add the dummy field add_settings_field('foo_dummy', __('Dummy Setting'), array($this, 'settings_field_dummy'), 'foo_settings', 'foo'); } /** * Validate and sanitize each setting that is entered into the options page. * @param array $input Contains all settings fields as array keys * @return array */ public function validate($input) { // validate dummy if (!empty($input['dummy'])) $input['dummy'] = trim($input['dummy']); // return sanitized input return $input; } /** * Callback to display the options page. */ public function options_page() { // load the options $this->options = get_option('foo'); // begin the options form echo '<div class="wrap">'; echo '<h2>' . __('Foo Settings') . '</h2>'; echo '<form method="post" action="options.php">'; // render settings fields settings_fields('foo'); do_settings_sections('foo_settings'); // render submit button submit_button(__('Save Changes'), 'primary', 'submit', false); // end the options form echo '</form>'; echo '</div>'; } /** * Callback to add the section settings */ public static function settings_section_foo() { //echo __('Foo Settings:'); } /** * Callback to add the dummy setting field */ public function settings_field_dummy() { echo strtr('<input type="text" id="foo_dummy" name="foo[dummy]" class="regular-text" value=":value" /><p class="description">:description</p>', array( ':value' => isset($this->options['dummy']) ? esc_attr($this->options['dummy']) : '', ':description' => __('This is a placeholder setting, will be replaced when we have settings that need to be added.'), )); } }
wp-content/plugins/foo/app/assets/css/foo_admin.css
/** Your admin styles go here. */
wp-content/plugins/foo/app/assets/css/foo_front.css
/** Your front styles go here. */
wp-content/plugins/foo/app/components/FooController.php
<?php /** * FooController is the base controller for other controllers in the Foo plugin. */ class FooController extends YiiEmbedController { /** * Initialize the controller */ public function init() { // parent init parent::init(); // set the view path Yii::app()->viewPath = Yii::getPathOfAlias('foo.views'); } }
wp-content/plugins/foo/app/controllers/FooBarController.php
<?php /** * FooBarController is an example controller. */ class FooBarController extends FooController { /** * @param CAction $action * @return bool */ public function beforeAction($action) { if (is_admin()) { if (in_array($action->id, array('admin', 'view', 'create', 'update', 'delete'))) return true; } else { if (in_array($action->id, array('index', 'view'))) return true; } return false; } /** * Admin */ public function actionAdmin() { $model = new FooBar('search'); $model->unsetAttributes(); // clear any default values if (isset($_GET['FooBar'])) $model->attributes = $_GET['FooBar']; $this->render('admin', array( 'model' => $model, )); } /** * Create */ public function actionCreate() { $model = new FooBar('create'); // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if (isset($_POST['FooBar'])) { $model->attributes = $_POST['FooBar']; if ($model->save()) $this->redirect(array('view', 'id' => $model->id)); } $this->render('create', array( 'model' => $model, )); } /** * Update * @param integer $id the ID of the model to be updated */ public function actionUpdate($id) { $model = $this->loadModel($id); // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if (isset($_POST['FooBar'])) { $model->attributes = $_POST['FooBar']; if ($model->save()) $this->redirect(array('view', 'id' => $model->id)); } $this->render('update', array( 'model' => $model, )); } /** * Delete * @param integer $id the ID of the model to be deleted */ public function actionDelete($id) { $this->loadModel($id)->delete(); // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser if (!isset($_GET['ajax'])) $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin')); } /** * Index */ public function actionIndex() { $dataProvider = new CActiveDataProvider('FooBar'); $this->render('index', array( 'dataProvider' => $dataProvider, )); } /** * View Page * @param integer $id the ID of the model to be displayed */ public function actionView($id) { $this->render('view', array( 'model' => $this->loadModel($id), )); } }
wp-content/plugins/foo/app/models/FooBar.php
<?php /** * FooBar is an example model. */ class FooBar extends YiiEmbedActiveRecord { /** * Returns the static model of the specified AR class. * @param string $className active record class name. * @return FooBar the static model class */ public static function model($className = __CLASS__) { return parent::model($className); } /** * @return string the associated database table name */ public function tableName() { return '{{foo_bar}}'; } /** * @return array validation rules for model attributes. */ public function rules() { $rules = array(); if ($this->scenario == 'search') { $rules[] = array('id, name, description', 'safe'); } if (in_array($this->scenario, array('create', 'update'))) { $rules[] = array('name, description', 'required'); $rules[] = array('name', 'length', 'max' => 255); } return $rules; } /** * Retrieves a list of models based on the current search/filter conditions. * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions. */ public function search() { $criteria = new CDbCriteria; $criteria->compare('t.id', $this->id); $criteria->compare('t.name', $this->name, true); $criteria->compare('t.description', $this->description, true); return new CActiveDataProvider($this, array( 'criteria' => $criteria, )); } }
wp-content/plugins/foo/app/views/fooBar/_view.php
<div class="view"> <b><?php echo CHtml::encode($data->getAttributeLabel('name')); ?>:</b> <?php echo CHtml::link($data->name, array('fooBar/view', 'id' => $data->id)); ?> <br/> <b><?php echo CHtml::encode($data->getAttributeLabel('description')); ?>:</b> <?php echo CHtml::encode($data->description); ?> <br/> </div>
wp-content/plugins/foo/app/views/fooBar/admin.php
<?php $this->pageTitle = Yii::t('foo', 'FooBar Admin'); $this->widget('zii.widgets.grid.CGridView', array( 'id' => 'foo-bar-grid', 'dataProvider' => $model->search(), 'filter' => $model, 'columns' => array( 'id', 'name', 'description', array( 'class' => 'CButtonColumn', ), ), ));
wp-content/plugins/foo/app/views/fooBar/create.php
<?php $this->pageTitle = Yii::t('foo', 'Create FooBar'); $this->renderPartial('_form', array('model' => $model));
wp-content/plugins/foo/app/views/fooBar/_form.php
<div class="form"> <?php $form = $this->beginWidget('CActiveForm', array( 'id' => 'foo-bar-form', )); ?> <?php echo $form->errorSummary($model); ?> <div class="row"> <?php echo $form->labelEx($model, 'name'); ?> <?php echo $form->textField($model, 'name', array('size' => 60, 'maxlength' => 255)); ?> <?php echo $form->error($model, 'name'); ?> </div> <div class="row"> <?php echo $form->labelEx($model, 'description'); ?> <?php echo $form->textArea($model, 'description', array('rows' => 6, 'cols' => 50)); ?> <?php echo $form->error($model, 'description'); ?> </div> <div class="row buttons"> <?php echo CHtml::submitButton($model->isNewRecord ? Yii::t('foo', 'Create') : Yii::t('foo', 'Save')); ?> </div> <?php $this->endWidget(); ?> </div>
wp-content/plugins/foo/app/views/fooBar/index.php
<?php $this->pageTitle = Yii::t('foo', 'FooBars'); $this->widget('zii.widgets.CListView', array( 'dataProvider' => $dataProvider, 'itemView' => '_view', ));
wp-content/plugins/foo/app/views/fooBar/update.php
<?php $this->pageTitle = Yii::t('foo', 'Update FooBar #:id', array(':id' => $model->id)); $this->renderPartial('_form', array('model' => $model));
wp-content/plugins/foo/app/views/fooBar/view.php
<?php $this->pageTitle = Yii::t('foo', 'View FooBar #:id', array(':id' => $model->id)); $this->widget('zii.widgets.CDetailView', array( 'data' => $model, 'attributes' => array( 'name', 'description', ), ));
// TODO
You can use Yii's awesome code generator from your WordPress site, just like you can in any other Yii app. Simply browse to your
example.com/gii
.
You must set WP_DEBUG
to TRUE
in wp-config.php
, once this is done you can use Gii without a password.
Some generators do not allow the selection of a path (for example CrudGenerator) so you will have to generate them into the wp-content/plugins/yii-embed-wordpress/app
folder and then move them to your plugin app folder.
To tune the Gii configuration or security access edit wp-content/yii-embed-wordpress/app/config/main.php
.
Use the ModelDoc Generator to replace the phpdoc blocks in your models.
All the default Gii Generators including Controller Generator, Crud Generator, Form Generator, Model Generator and Module Generator are also available.