首頁  >  文章  >  CMS教程  >  在您的網站上展示 WordPress.org 外掛的訊息

在您的網站上展示 WordPress.org 外掛的訊息

PHPz
PHPz原創
2023-09-03 14:05:061102瀏覽

在您的网站上展示 WordPress.org 插件的信息

#在本文的第一部分中,我們討論瞭如何使用內建函數與 WordPress.org 進行通訊並檢索外掛程式詳細資訊。

在本教程中,我們將把理論付諸實踐,創建一個簡單的插件,該插件將允許我們使用簡碼在我們的 WordPress 網站上顯示 WordPress.org 上託管的任何插件的詳細資訊。 p>


開始使用

我假設您是外掛程式開發人員並且了解基礎知識,但如果有疑問,我建議閱讀以下兩篇文章:

  • 開發 WordPress 外掛的兩種方法:函數式程式設計
  • 開發 WordPress 外掛程式的兩種方法:物件導向程式設計

我們在做什麼?

透過這個插件,我們想要建立一個短代碼,例如[mpi slug='my-plugin-information' field='version'] ,它可以接受兩個屬性:“slug”和“field”,然後基於然後,我們檢索並顯示WordPress.org 儲存庫中託管的任何插件的資訊。

建立外掛程式庫

讓我們先在 wp-content/plugins 目錄中建立一個名為 my-plugin-information 的資料夾。在其中建立一個名為 my-plugin-info.php 的文件,並將以下程式碼貼到其中:

<?php
/*
Plugin Name: My Plugin Info
Plugin URI: https://myplugininfo.com
Description: Communicate with WordPress.org Plugins API to retrive your Plugin Information
Version: 0.1
Author: Harish
Author Email: mye@email.com
License: GPL3
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

if ( ! class_exists( 'DOT_MyPluginInfo' ) )
{

	class DOT_MyPluginInfo {

		/**
		 * Constructor
		 */
		function __construct() {

			//Hook up to the init action
			add_action( 'init', array( &$this, 'init_my_plugin_info' ) );

		}

		/**
		 * Runs when the plugin is initialized
		 */
		function init_my_plugin_info() {

			// Register the shortcode [mpi slug='my-plugin-info' field='version']
			add_shortcode( 'mpi', array( &$this, 'render_mpi' ) );

		}

		function render_mpi($atts) {

		}

	} // end class

	new DOT_MyPluginInfo();
}
?>

我們做了什麼?

在上面的程式碼中,我們建立並初始化了外掛程式類別 DOT_MyPluginInfo。其中包含任何插件的通用區塊,例如 __construct() 方法。

函數 init_my_plugin_infoinit 操作掛鉤,以便它在載入 WordPress 之後但在發送任何標頭之前運行。在函式 init_my_plugin_info 中,我們使用 add_shortcode 函式註冊了我們的短程式碼。

注意:要了解有關 add_shortcode 的更多信息,請查看 Codex。

上面的外掛現在有足夠的程式碼可以被 WordPress 從外掛儀表板識別。如果您已經按照說明建立了文件,現在可以訪問插件頁面並啟用此外掛程式。


設定簡碼

由於我們希望靈活地選擇要顯示有關插件的信息,因此我們創建了一個具有兩個屬性的短代碼。第一個稱為「slug」將用於指定需要檢索哪個插件的資料。第二個屬性「field」將用於指定我們需要顯示的插件的具體資訊。

例如,如果我們想顯示該插件的下載次數,我們只需在帖子編輯器下方添加文本,最終結果應該是「下載了 100 次」之類的內容。 p>

Downloaded [mpi slug='my-plugin-information' field='downloaded'] times.

使用 add_shortcode 我們註冊了我們的短代碼,以便每當在帖子內容中找到短代碼時,都會調用函數 render_mpi() 來處理它。從現在開始,其餘程式碼將放置在該函數內來處理我們的短程式碼。

使用 render_mpi() 處理短代碼

要顯示插件訊息,我們首先需要處理短代碼以獲取屬性。在 render_api 函數中加入以下程式碼:

// get our variable from $atts
extract( shortcode_atts( array(
	'slug' => '', //foo is a default value
	'field' => ''
), $atts ) );

這會提取兩個屬性「slug」和「field」(如果提供)。在繼續之前,我們首先檢查「slug」和「field」的值是否存在,如果不存在,則停止進一步處理。

/**
 * Check if slug exists
 */
if ( ! $slug ) {
	return false;
}

/**
 * Check if field exists
 * Return value based on the field attribute
 */
if ( ! $field ) {
	return false;
} else {

} // $field check

上面的程式碼將檢查「slug」是否存在,如果不存在,則傳回 false。如果「slug」確實存在,它將繼續檢查「field」屬性。由於我們只是創建一個短代碼來顯示有關插件的特定信息,因此在進一步處理之前檢查這兩個屬性是否存在將節省對 WordPress.org 插件 API 的不必要的調用。

現在,如果短代碼中提供了「slug」和「field」屬性的值,我們將首先清理這兩個值。

// Sanitize attributes
$slug = sanitize_title( $slug );
$field = sanitize_title( $field );

在瞬態中儲存外掛程式資料

為了避免每次加載包含此短代碼的頁面時都向 WordPress.org 發送請求,我們需要在本地保存外掛程式資訊。這樣,如果您放置了多個短代碼來顯示同一插件的不同詳細信息,我們就可以通過顯示您網站上本地保存的信息中的數據來加快這一過程。

但是如果外掛程式更新並且我們繼續顯示舊資料怎麼辦? 為了解決這個問題,最快的選擇是使用 Transients API 保存我們的個人插件資料並設定到期日資料。

另一個問題是,如果您有正在檢索有關不同插件的資料的短代碼。如果我們使用單一暫存名稱儲存它們,結果可能會出乎意料。為了解決這個問題,我們使用「slug」屬性為保存的瞬態提供一個唯一的名稱。

为什么要经历这一切?

  • 单独保存每个插件的信息
  • 减少向 WordPress.org 发出的请求
  • 通过直接从您自己的网站提供数据来更快地加载数据

让我们首先创建一个变量 $mpi_transient_name 来保存基于“slug”属性的唯一瞬态名称。

// Create a empty array with variable name different based on plugin slug
$mpi_transient_name = 'mpi-' . $slug;

接下来我们检查瞬态是否已经存在:

/**
 * Check if transient with the plugin data exists
 */
 $mpi_info = get_transient( $mpi_transient_name );

如果瞬态存在,我们将继续根据“field”属性显示数据,否则我们使用 plugins_api 连接到 WordPress.org 并请求插件信息。

if ( empty( $mpi_info ) ) {

	/**
	 * Connect to WordPress.org using plugins_api
	 * About plugins_api -
	 * https://code.tutsplus.com/tutorials/communicating-with-the-wordpress-org-plugin-api--wp-33069
	 */
	require_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
	$mpi_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) );

	// Check for errors with the data returned from WordPress.org
	if ( ! $mpi_info or is_wp_error( $mpi_info ) ) {
		return false;
	}

	// Set a transient with the plugin data
	// Use Options API with auto update cron job in next version.
	set_transient( $mpi_transient_name, $mpi_info, 1 * HOUR_IN_SECONDS );

}

在上面的代码中,我们做了三件事:

  1. 我们连接到 WordPress.org 并请求插件信息。然后该请求被保存在名为 $mpi_info 的变量中
  2. 然后我们进行错误检查,以确保返回的数据是否没有错误
  3. 最后,我们创建了一个过期日期为一小时的新瞬态

现在,如果 slug 属性的值为“my-plugin-information”,那么存储插件信息的瞬态名称将为“mpi-my-plugin-information”。

注意:要了解有关 plugins_api 的更多信息,请参阅本系列的第一篇文章,如本文顶部所示。

显示插件信息

最后一步涉及根据“field”属性的值返回特定信息。为此,我们只需使用单独的检查即可。

if ( $field == "downloaded" ) {
	return $mpi_info->downloaded;
}

if ( $field == "name" ) {
	return $mpi_info->name;
}

if ( $field == "slug" ) {
	return $mpi_info->slug;
}

if ( $field == "version" ) {
	return $mpi_info->version;
}

if ( $field == "author" ) {
	return $mpi_info->author;
}

if ( $field == "author_profile" ) {
	return $mpi_info->author_profile;
}

if ( $field == "last_updated" ) {
	return $mpi_info->last_updated;
}

if ( $field == "download_link" ) {
	return $mpi_info->download_link;
}

总结

完整的插件代码:

<?php
/*
Plugin Name: My Plugin Information
Plugin URI: https://code.tutsplus.com
Description: Communicate with WordPress.org Plugins API to retrive your Plugin Information
Version: 0.1.1
Author: Harish
Author Email: me@email.com
License:

  Copyright 2013 Harish

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License, version 3, as
  published by the Free Software Foundation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

if ( ! class_exists( 'DOT_MyPluginInfo' ) )
{

	class DOT_MyPluginInfo {

		/**
		 * Constructor
		 */
		function __construct() {

			//Hook up to the init action
			add_action( 'init', array( &$this, 'init_my_plugin_info' ) );

		}

		/**
		 * Runs when the plugin is initialized
		 */
		function init_my_plugin_info() {

			// Register the shortcode [mpi slug='my-plugin-info' field='version']
			add_shortcode( 'mpi', array( &$this, 'render_mpi' ) );

		}

		function render_mpi($atts) {

			// get our variable from $atts
			extract(shortcode_atts(array(
				'slug' => '', //foo is a default value
				'field' => ''
			), $atts));

			/**
			 * Check if slug exists
			 */
			if ( ! $slug ) {
				return false;
			}

			/**
			 * Check if field exists
			 * Return value based on the field attribute
			 */
			if ( ! $field ) {

				return false;

			} else {

				// Sanitize attributes
				$slug = sanitize_title( $slug );
				$field = sanitize_title( $field );

				// Create a empty array with variable name different based on plugin slug
				$mpi_transient_name = 'mpi' . $slug;

				/**
				 * Check if transient with the plugin data exists
				 */
				$mpi_info = get_transient( $mpi_transient_name );

				if ( empty( $mpi_info ) ) {

					/**
					 * Connect to WordPress.org using plugins_api
					 * About plugins_api -
					 * https://code.tutsplus.com/tutorials/communicating-with-the-wordpress-org-plugin-api--wp-33069
					 */
					require_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
					$mpi_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) );

					// Check for errors with the data returned from WordPress.org
					if ( ! $mpi_info or is_wp_error( $mpi_info ) ) {
						return false;
					}

					// Set a transient with the plugin data
					// Use Options API with auto update cron job in next version.
					set_transient( $mpi_transient_name, $mpi_info, 1 * HOUR_IN_SECONDS );

				}

				if ( $field == "downloaded" ) {
					return $mpi_info->downloaded;
				}

				if ( $field == "name" ) {
					return $mpi_info->name;
				}

				if ( $field == "slug" ) {
					return $mpi_info->slug;
				}

				if ( $field == "version" ) {
					return $mpi_info->version;
				}

				if ( $field == "author" ) {
					return $mpi_info->author;
				}

				if ( $field == "author_profile" ) {
					return $mpi_info->author_profile;
				}

				if ( $field == "last_updated" ) {
					return $mpi_info->last_updated;
				}

				if ( $field == "download_link" ) {
					return $mpi_info->download_link;
				}

			} // $field check

		} // render_mpi()

	} // end class
	new DOT_MyPluginInfo();

}

?>

此插件代码可在 GitHub 上找到,您也可以从 WordPress.org 下载


付诸行动

现在您只需转到帖子编辑器并添加一个短代码,例如:

Downloaded &#91;mpi slug='my-plugin-information' field='downloaded'&#93; times.

它会显示:

Downloaded 10 times.

显示有关插件的其他信息的示例简码

通过替换“field”属性的值,您可以显示不同的信息,例如:

  • 插件名称:[mpi slug='my-plugin-information' field='name']
  • 插件版本:[mpi slug='my-plugin-information' field='version']
  • 插件 Slug:[mpi slug='my-plugin-information' field='slug']
  • 插件作者(返回名称和链接):[mpi slug='my-plugin-information' field='author']
  • 作者简介(返回个人资料地址):[mpi slug='my-plugin-information' field='author_profile']
  • 最后更新:[mpi slug='my-plugin-information' field='last_updated']
  • 下载链接:[mpi slug='my-plugin-information' field='download_link']

改进

为了简单起见,我使用瞬态来保存插件信息。然而,瞬态从来就不是用来保存重要数据的。另一种方法是使用选项 API、add_options() 或作为 post meta 保存插件数据,然后安排一个 cron 任务每小时更新一次数据。


接下来做什么?

使用 plugins_api,我们已经演示了通信和检索 WordPress.org 上托管的任何插件的信息是多么容易。

您可能还想查看其他插件,例如 Plugin Info(也使用 plugins_api 和 I Make Plugins,看看它们如何完成相同的任务。

以上是在您的網站上展示 WordPress.org 外掛的訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn