問題描述
我正在寫一個插件來發送邀請給一個朋友,當點擊鏈接時打開一個表單。我通過按照 @toscho 的 Report Broken Video 插件中給出的代碼封裝了類中的所有功能。相關代碼如下:
/*
Plugin Name: Send Invitation
Plugin URI: http://w3boutique.net
Description: Emails a the link of the current page to a friend
Author: Nandakumar Chandrasekhar
Version: 0.1
Author URI: http://w3boutique.net/about-nanda.html
License: GPL2
*/
// include() or require() any necessary files here
// Settings and/or Configuration Details go here
define('SEND_INVITATION_MIN_WORDPRESS_VERSION', '3.1.1');
define('SEND_INVITATION_PLUGIN_URL', plugins_url('', __FILE__));
add_action( 'init', array( 'SendInvitation', 'nc_sendinvitation_init' ) );
class SendInvitation {
protected $nonce_name = 'nc_sendinvitation';
protected $post_url = '';
public static function nc_sendinvitation_init() {
new self;
}
public function __construct() {
add_action( 'init', array(&$this, 'nc_sendinvitation_head' ));
add_action( 'init', array(&$this, 'nc_sendinvitation_check_wordpress_version' ));
add_action( 'init', array(&$this, 'nc_sendinvitation_form_action' ));
//$this->post_url = $this->nc_sendinvitation_get_post_url();
}
public function nc_sendinvitation_head() {
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'send_invitation_js',
plugins_url( 'js/send-invitation.js', __FILE__ ),
array( 'jquery' ) );
wp_enqueue_style( 'send_invitation_css',
plugins_url( 'css/send-invitation.css', __FILE__ ) );
}
public function nc_sendinvitation_check_wordpress_version() {
global $wp_version;
$exit_msg = 'Send Invitation requires version '
. SEND_INVITATION_MIN_WORDPRESS_VERSION
. 'or newer <a href="http://codex.wordpress.org/Upgrading_WordPress">Please
update!</a>';
if ( version_compare( $wp_version, SEND_INVITATION_MIN_WORDPRESS_VERSION, '<') )
{
exit( $exit_msg );
}
}
public function nc_sendinvitation_form_action() {
$action = '';
if ( $_SERVER['REQUEST_METHOD'] != 'POST' )
{
$action = $this->nc_sendinvitation_get_form();
}
else if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
$action = $this->nc_sendinvitation_handle_submit();
}
return $action;
}
public function nc_sendinvitation_get_form() {
// Start the output buffer, prevents content being output directly into
// script, instead it is stored in a buffer which can then be flushed
// to allow the include file to be stored in a variable
// See http://www.codingforums.com/showthread.php?t=124537
ob_start();
include('send-invitation-form.php');
$send_invitation_link = ob_get_clean();
return $send_invitation_link;
}
public function nc_sendinvitation_handle_submit() {
if ( isset( $_POST['form_type'] ) && ( $_POST['form_type'] == 'nc_sendinvitation' ) ) {
$to = 'navanitachora@gamil.com';
$subject = 'Invitation to SwanLotus';
$message = 'Navanitachora invites you to take a look at this link';
wp_mail($to, $subject, $message);
$result = 'Email was sent successfully';
}
else {
$result = $this->nc_sendinvitation_get_form();
}
return $result;
}
public function nc_sendinvitation_get_post_url() {
global $post;
$blog_id = get_option('page_for_posts');
$post_id = '';
if (is_home($blog_id)) {
$post_id = $blog_id;
} else {
$post_id = $post->ID;
}
return get_permalink($post_id);
}
}
/* End of File */
?>
關於如何在我的模板中使用這個類,我很失望,以便我可以顯示錶單。我知道我需要實例化該類,但是我不知道在哪裏放置代碼以及如何訪問對象,以便我可以在我的模板中使用它。我知道 OOP,但是在此之前沒有使用它,並且需要一點一步的指導。
非常感謝。
最佳解決方案
在不知道對象的情況下使用您的類的最佳方式是 action 。在加載演示文稿的主題文件之前,您需要註冊該操作,WordPress 將處理其餘的操作。
示例代碼:
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: Plugin Action Demo
*/
add_action( 'init', array ( 'Plugin_Action_Demo', 'init' ) );
class Plugin_Action_Demo
{
/**
* Creates a new instance.
*
* @wp-hook init
* @see __construct()
* @return void
*/
public static function init()
{
new self;
}
/**
* Register the action. May do more magic things.
*/
public function __construct()
{
add_action( 'plugin_action_demo', array ( $this, 'print_foo' ), 10, 1 );
}
/**
* Prints 'foo' multiple $times.
*
* Usage:
* <code>do_action( 'plugin_action_demo', 50 );</code>
*
* @wp-hook plugin_action_demo
* @param int $times
* @return void
*/
public function print_foo( $times = 1 )
{
print str_repeat( ' foo ', (int) $times );
}
}
現在您可以在主題或另一個插件中的某個地方調用 do_action( 'plugin_action_demo', 50 );,而不必再關心該類的內部工作。
如果您停用插件,您仍然是安全的:WordPress 只是忽略未知的操作,do_action()將不會有任何傷害。另外,其他插件能夠刪除或替換動作,因此您可以使用一個 add_action()構建一個漂亮的迷你 API 。
你也可以建立單例:
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: Plugin Singleton Demo
*/
class Plugin_Singleton_Demo
{
protected static $instance = NULL;
/**
* Creates a new instance if there isn't one.
*
* @wp-hook init
* @return object
*/
public static function get_instance()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Not accessible from the outside.
*/
protected function __construct() {}
/**
* Prints 'foo' multiple $times.
*
* @param int $times
* @return void
*/
public function print_foo( $times = 1 )
{
echo str_repeat( ' foo ', (int) $times );
}
}
現在可以使用 print_foo():
Plugin_Singleton_Demo::get_instance()->print_foo();
我不推薦 Singleton 模式。它有一些 serious drawbacks 。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。