如何向静态页面添加活动条目

时间:2017-02-05 作者:Greg Skala

我想创建一个新的静态页面(用于共享新闻-网络链接),在这里我将上传每天有趣的网页链接条目、我的简短评论,到带有标签的网页新闻,页面看起来像:

Data 05/02/2017

(tag ) web link :  
My Comment ( optional )  

(tag ) web link : 
My Comment ( optional )

Data 04/02/2017 

(tag ) web link :
My Comment ( optional ) 

etc...
我应该为此创建新的数据库吗?插件等我们的想法是在管理面板中没有条目,并且有多个字段,如weblink、信息源、评论。或者像这样的事情已经存在了?

1 个回复
SO网友:Pedro Coitinho

好的,给你。

我制作了一个线框供您使用,它可以保存到自定义表的链接,并在管理页面中添加一个表单。

再一次我认为这太过分了。“用wordpress的方式”是一种更安全的选择。但是,这是一个有趣的小练习,我不经常做!

我将复制粘贴下面的代码。您需要将其保存到wp-content 并激活插件。

以下是插件激活后管理员的样子:

enter image description here

要在前端使用它,您必须获取全局类并调用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();

相关推荐