好的,给你。
我制作了一个线框供您使用,它可以保存到自定义表的链接,并在管理页面中添加一个表单。
再一次我认为这太过分了。“用wordpress的方式”是一种更安全的选择。但是,这是一个有趣的小练习,我不经常做!
我将复制粘贴下面的代码。您需要将其保存到wp-content
并激活插件。
以下是插件激活后管理员的样子:
要在前端使用它,您必须获取全局类并调用
read_links_archive( $args )
像这样:
global $customlinks;
$links = $customlinks->get_links_archive();
foreach ( $links as $link ) { ... }
另外,请注意,代码非常不完整!但如果可能的话,我会提供一些链接,这样你就可以很好地开始了!
It works like this:
<有一个CustomLinks类,其中包含所有CRUD函数(不包括delete,这是为了让您玩得开心)和管理渲染魔术。当插件通过一个钩子激活时,数据库就会安装在construct上,它添加了创建数据库架构和注册菜单页的操作。菜单页加载一个查找“action”post变量的“router”,它相应地调用方法,最后,该类被实例化为
$customlinks
可以使用访问的变量
global
关键字
You\'ll have to fill in the gaps:
- 删除方法不存在,更新方法没有接口,保存操作不受保护,无论是通过Nonces还是能力检查
read_links_archive
is不按日期筛选,也没有分页(但它的设置是接收参数的) - 您需要在管理页面中进行分页,使其更加完善
玩代码,玩得开心。如果您有任何问题,请随时提问。
干杯
The code:
<?php
/**
* Custom links
*
* Plugin Name: Custom links
* Version: 0.1
*
*/
class CustomLinks {
/**
* Constructor
*/
function __construct() {
// add actions
// install database on activation
register_activation_hook( __FILE__, array( $this, \'setup_database\') );
// menu items
add_action( \'admin_menu\', array( $this, \'add_menu_item\' ) );
}
/*****************************
Setup database
*****************************/
/**
* Creates the database schema
*
* Hook onto plugin initialize
*
* @link https://codex.wordpress.org/Creating_Tables_with_Plugins
*/
public function setup_database() {
// get the wordpress database helper
global $wpdb;
// table name
$table_name = $wpdb->prefix . \'custom_links\';
// get colation
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
ID mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
link text NOT NULL,
PRIMARY KEY (ID)
) $charset_collate;";
require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
dbDelta( $sql );
}
/*****************************
CRUD functions
*****************************/
/**
* Returns a single link
*
* @param int $id The link ID
* @return string|bool The link or false
*/
public function read_link_single( $id ) {
global $wpdb;
$sql = $wpdb->prepare( "
SELECT link
FROM {$wpdb->prefix}custom_links
WHERE ID = %d
LIMIT 1
", $id );
$result = $wpdb->get_results( $sql );
// databse error, return false
if ( ! $result ) { return false; }
// return first result
return $result[0];
}
/**
* Returns all links
*
* @param array $args Optional arguments to pass, such as limit or date
* @return string[]|bool The links or false
*/
public function read_link_archive( $args = array() ) {
global $wpdb;
// default values
$default = array(
\'limit\' => 10
);
// parses default values
$args = wp_parse_args( $args, $default );
$sql = $wpdb->prepare( "
SELECT *
FROM {$wpdb->prefix}custom_links
LIMIT %d
", $args[ \'limit\' ] );
return $wpdb->get_results( $sql );
// TODO: Pagination, filtering ETC
}
/**
* Creates link, returns ID
*
* @link https://codex.wordpress.org/Class_Reference/wpdb#INSERT_row
* @param string $link The link URL
* @return int|bool Link unique ID, or false
*/
public function create_link( $link ) {
global $wpdb;
// sanitize link
$link = esc_url( $link );
// try to insert
$result = $wpdb->insert(
$wpdb->prefix . \'custom_links\',
array(
\'time\' => current_time( \'mysql\' ),
\'link\' => $link
)
);
// return error
if ( ! $result ) { return false; }
// otherwise return id of new row
return $wpdb->insert_id;
}
/**
* Updates the selected links
*
* @link https://codex.wordpress.org/Class_Reference/wpdb#UPDATE_rows
* @param int $id The id to update
* @param string $link The link URL
* @return bool Update sucessful?
*/
public function update_link( $id, $link ) {
global $wpdb;
$result = $wpdb->update(
$wpdb->prefix . \'custom_links\',
array(
\'link\' => $link, // new value string
),
array( \'ID\' => $id ) // condition
);
// return update status
return $result !== false;
}
/*****************************
Display functions for admin
******************************/
/**
* Adds a menu item for links
*
* Hook into admin_menu
*
* @link https://developer.wordpress.org/reference/functions/add_menu_page/
*/
public function add_menu_item() {
add_menu_page(
\'Custom Links\',
\'Custom Links\',
\'manage_options\',
\'custom_links\',
array( $this, \'route_links_page\' )
);
}
/**
* "Route links page"
*/
public function route_links_page() {
// check \'action\'
$action = $_POST[ \'action\' ] || \'\';
// switch here for more pages in the future
switch ( $action ) {
case \'save\':
// save action
$this->save_link();
$this->render_links_page();
break;
default:
// by default, render links
$this->render_links_page();
break;
}
}
/**
* Renders the link page
*
* @param int $page The paginations current page to show
*/
private function render_links_page( $page = 0 ) {
// get all links ( 10 by default )
$links = $this->read_link_archive();
?>
<div class="wrap">
<h1>Custom Links</h1>
</div>
<!-- links -->
<table class="wp-list-table widefat fixed striped posts">
<tbody id="">
<?php foreach ( $links as $link ) : ?>
<tr>
<td><? echo $link->link ?></td>
<td><? echo $link->time ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<?php // TODO: Edit and delete link ?>
</table>
<!-- add new link -->
<h2>Add New Link</h2>
<form action="<?php menu_page_url( \'custom_links\' ); ?>" method="post">
<input type="hidden" name="action" value="save">
<label for="link">Link: </label>
<input type="text" name="link">
<?php submit_button( \'Save Link\' ); ?>
<?php // TODO: Protect with Nonce ?>
</form>
<?php }
/**
* Saves the links and outputs message
*/
private function save_link() {
if ( isset( $_POST[ \'link\' ] ) ) {
$result = $this->create_link( esc_url( $_POST[ \'link\' ] ) );
}
if ( $result ) : ?>
<div class="notice notice-success">
<p>Link ID <?php echo $result; ?> saved.</p>
</div>
<? else : ?>
<div class="notice notice-error">
<p>There was a problem saving the link</p>
</div>
<?php endif;
}
}
/*****************************
Instantiate
******************************/
$customlinks = new CustomLinks();