markdown 有用的WordPress插件片段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 有用的WordPress插件片段相关的知识,希望对你有一定的参考价值。

# Integratig your plugin into WordPress

## Menus and submenus

`add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );`

- `$page_title`: displayed between `<title>` tags
- `$menu_title`: displayed on the dashboard
- `$capability`: minimum capability required to access the menu
- `$function`: function called to display page content 
- `$icon_url`: URL to custom image to use as menu icon
- `$position`: order in the menu

Use `admin_menu` action hook to trigger menu code.

*Example:*

```php
add_action( 'admin_menu', 'lzp_create_menu' );

function lzp_create_menu() {
  
  // create custom menu
  add_menu_page(
    'My Plugin Settings Page',
    'My Plugin Settings',
    'manage_options', // only administrators can access
    __FILE__,
    'lzp_settings_page',
    plugins_url('/images/wp-icon.png', __FILE__)
  );
}
```

Do not forget to add where the settings can be accessed in your documentation.

### Submenus


`add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function );`

- `$parent_slug`: previously defined `$menu_slug` of the the top-level menu
- `$page_title`: displayed between `<title>` tags
- `$menu_title`: displayed on the dashboard
- `$capability`: minimum capability required to access the menu
- `$function`: function called to display page content 

*Example:*

```php
add_action( 'admin_menu', 'lzp_create_menu' );

function lzp_create_menu() {
  
  // create custom menu
  add_menu_page(
    'My Plugin Settings Page',
    'My Plugin Settings',
    'manage_options', // only administrators can access
    __FILE__,
    'lzp_settings_page',
    plugins_url('/images/wp-icon.png', __FILE__)
  );
  
  // create custom sub menus
  add_submenu_page( __FILE__, 'About My Plugin', 'About', 'manage_options', __FILE__ . 'about', 'lzp_about_page' );
  add_submenu_page( __FILE__, 'My Plugin Help', 'Help', 'manage_options', __FILE__ . 'help', 'lzp_help_page' );
  add_submenu_page( __FILE__, 'Uninstall My Plugin', 'Uninstall', 'manage_options', __FILE__ . 'uninstall', 'lzp_uninstall_page' );
}
```

Do not forget to add where the settings can be accessed in your documentation.

### Add a menu ton an existing menu

`add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function );`

- `$page_title`: displayed between `<title>` tags
- `$menu_title`: displayed on the dashboard
- `$capability`: minimum capability required to access the menu
- `$function`: function called to display page content 

*Example:*

```php
add_action( 'admin_menu', 'lzp_create_menu' );

function lzp_create_menu() {
  
  // create submenu under Settings
  add_options_page(
    'My Plugin Settings Page',
    'My Plugin Settings',
    'manage_options', // only administrators can access
    __FILE__,
    'lzp_settings_page'
  );
  
}
```

Do not forget to add where the settings can be accessed in your documentation.

List of all WordPress submenu functions


- `add_dashboard_page`
- `add_posts_page`
- `add_media_page`
- `add_links_page`
- `add_pages_page`
- `add_comments_page`
- `add_theme_page`
- `add_plugins_page`
- `add_users_page`
- `add_management_page`
- `add_options_page`

If your plugin only needs a single options page, add it to an existing menu. Otherwise, it's better to create a new top-level menu.

## Widgets

### The `WP_Widget` class

- Extend the `WP_Widget` class
  
  ```php
  
  class lzp_mywidget extends WP_Widget {
    
    function lzp_mywidget() {
      // processes the widget
    }
    
    function form( $instance ) {
      // displays widget form in the admin dashboard
    }
    
    function update( $new_instance, $old_instance ) {
      // processes widget options to save
    }
    
    function widget( $args, $instance ) {
      // displays the widget
    }
    
  }
  
  ```
  
- Create a widget

  ```php
  add_action( 'widgets_init', 'lzp_mywidget_register_widgets' );
  
  function lzp_mywidget_register_widgets() {
    
    register_widgets( 'lzp_mywidget' );
    
  }
  ```
  
  *Example: Widget to display favorite Movie and Song*
  
  ```php
  class lzp_movie_and_song extends WP_Widget {
    
    function lzp_movie_and_song() {
      
      $widget_ops = [
        'classname' => 'lzp_mywidget_widget_class', // class added to the li element of widget
        'description' => 'Display a user\'s favorite movie and song', // description showed on widget screen
      ];
      
      $this->WP_Widget( 'lzp_movie_and_song', 'Movie and Song', $widget_ops );
      
    }
    
    function form( $instance ) {
    
      $defaults = [
        'title' => 'Movie and Song',
        'movie' => '',
        'song' => '',
      ];
      
      $title = $instance['title'];
      $movie = $instance['movie'];
      $song = $instance['song'];
      ?>
      <p>Title: 
    
    }
    
    function update( $new_instance, $old_instance ) {
      // processes widget options to save
    }
    
    function widget( $args, $instance ) {
      // displays the widget
    }
    
  }
# Actions and Filters

- Actions: execute a function at a certain point
- Filters: manipulate the output passed through the hook

## Actions

### Create and Remove actions

- Create custom action hook

  - `$tag`: name of the action hook to create
  - `$args`: needed args (optionnal)


  ```php
  do_action( $tag, $arg1, $arg2, ...);
  ```

- Add an function to an action hook

  - `$tag`: name of the action hook
  - `$function`: name of called function
  - `$priority`: lower number, higher priority order
  - `$accepted_args`: parameters passed to the $function

  ```php
  add_action( $tag, $function, $priority, $accepted_args );
  ```

  - Action hook in a class :

    ```php
    add_action( $tag, array( &$this, $method_to_add ) );
    ```

- Remove a function to an action hook

  ```php
  remove_action( $tag, $function, $priority, $accepted_args );
  ```

  To remove default WordPress actions, have a look at `wp-includes/default-filters.php`.

- Remove all actions of a particular tag (**Not advised**)

  ```php
  remove_all_actions( $tag, $priority );
  ```

### Test actions

- Check if hook has actions

  ```php
  has_action( $tag, (opt) $function )
  ```

  Returns true, false or priority

- Check if action hook has already been executed and number of executions if so:

  ```php
  did_action( $tag )
  ```

  *Example:*

  ```php
  if ( did_action( 'plugin_loaded' ) ) {
    define( 'LZP_READY', true );
  }
  ```

### Commonly used action hooks

- `plugins_loaded`
  
  A WordPress plugin should do its setup on this hook.
  
  *Example:*

  ```php
  add_action( 'plugins-loaded', 'lzp_setup' );
  
  function lzp_setup() {
    add_action( ... );
    
  }
  ```
  
  **Creating a setup function and hook it to `plugins_loaded` is always a good idea**

- `init`
  
  Nearly everything is ready after this hook => To use when you need all the information from WordPress to be available.
  
  *Example:*

  ```php
  add_action( 'init', 'lzp_add_excerpts_to_pages' );
  ```

- `admin_menu`
  
  Called when an admin page loads.

- `template_redirect`
 
  The point where WordPress knows which page a user is viewing. Executed just before the theme template is chosen for the view.
  A good hook when in need of loading code only for specific page view (loading a specific stylesheet....).

- `wp_head`
  
  Launched by `wp_head()` function on front end
  
  Good hook when in need of adding `HTML` between `<head>` tags 

  **Do not add Javascript or CSS - except for specific cases - with this hook !**
  
- `widgets_init`

  Execute custom widgets

## Filters

### Create and remove filters

- Create custom filter hook
  
  ```php
    apply_filters( $tag, $value );
  ```

- Add function to a filter hook

  ```php
  add_filter( $tag, $function, $priority, $accepted_args );
  ```

  - And in a class :

    ```php
    add_filter( $tag, array( &$this, $method_to_add ) );
    ```

- Remove function from filter hook

  ```php
  remove_filter( $tag, $function, $priority, $accepted_args );
  ```

- Remove all functions from a filter hook
  
  ```php
  remove_all_filters( $tag, $priority );
  ```

### Test Filters

  ```php
  has_filter( $tag, $function );
  ```

### Commonly used filter hooks

- `the_content`
  
  Passes a post's content to any filters registered to `the_content`.
  
  *Example :*

  ```php
  add_filter( 'the_content', 'lzp_add_related_posts_to_content' );
  
  function lzp_add_related_posts_to_content( $content ) {
    // If not viewing a singular post, just return
    if ( ! is_singular( 'post' ) ) {
      return $content;
    }
    
    // Get the categories of current post
    $terms = get_the_terms( get_the_ID(), 'category' );
    
    // Loop through the categories and put their IDs in an array
    $categories = [];
    foreach ( $terms as $term ) {
      $categories[] = $term->term_id;
    }
    
    // Query posts with the same category
    $loop = new WP_Query ([
      'cat__in'  => $categories,
      'posts_per_page' => 5,
      'post__not_in' => [get_the_ID()],
      'orderby' => 'rand'
    ]);
    
    // Loop through Related posts, if any
    if ( $loop->have_posts() ) {
      
      // Open related posts list
      $content .= '<ul class="related-posts">';
      
      while ( $loop->have_posts() ) {
        $loop->the_post();
        
        // Add related post to the list and format it
        $content .= the_title(
          '<li><a href="' . get_permalink() . '">',
          '</a></li>',
          false
        );
        
      }
      
      // Close related posts list
      $content .= '</ul>';
      
      // Reset Query
      wp_reset_query();
      
    }
    
    return $content;
    
  }
  ```

- `the_title`
  
- `comment_text`

- `template_include`
  - `front_page_template`
  - `home_template`
  - `single_template`
  - `page_template`
  - `attachment_template`
  - `archive_template`
  - `category_template`
  - `tag_template`
  - `author_template`
  - `date_template`
  - `archive_template`
  - `search_template`
  - `404_template`
  - `index_template`

## Common functions

### Current hook

- Return the name of the current hook (action or filter)

  ```php
  current_filter();
  ```

### Quick return

```php
__return_false();
```

```php
__return_true();
```

```php
__return_empty_array();
```

```php
__return_zero();
```
# Create a new plugin

## Header

```php
<?php
/*
Plugin Name: My Plugin
Plugin URI: https://loren.zone/wordpress-plugins/my-plugin
Description: A brief description of what the plugin does
Version: 1.0
Author: Lorenzo Milesi
Author URI: https://loren.zone
License: GPL
*/

/*  Copyright YEAR  PLUGIN_AUTHOR_NAME  (email : PLUGIN AUTHOR EMAIL)
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    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
*/

```

## Path Functions

### Local paths

- Local Path to Plugin folder
  
  ```php
  echo plugin_dir_path(__FILE__);
  ```
  
- Local path to subfolder
  
  ```php
  echo plugin_dir_path(__FILE__).'js/scripts.js';
  ```
  
### URL paths

- Full plugins directory URL (best friend function)
  - `$path` - (string) (optional) — Path relative to the plugins URL 
  - `$plugin` -(string) (optional) — Plugin file that you want to be relative (that is, pass in __FILE__)
  
  ```php
  plugins_url( $path, $plugin );
  ```
  
  *Example:*
  
  ```php
  echo '<img src="' . plugins_url( 'images/icon.png', __FILE__ ) . '">';
  ```
  returns
  
  ```html
  <img src="http://example.com/wp-content/plugins/my-custom-plugin/images/icon.png">
  ```
  
  - supports mu-plugins
  - auto detects ssl
  - uses WP_PLUGIN_URL and WPMU_PLUGIN_URL

- Full includes directory URL

  *https://website.com/wp-includes*

  `includes_url();`

- Full content directory URL

  *https://website.com/wp-content*

  `content_url();`

- Full admin directory URL

  *https://website.com/wp-admin*

  `admin_url();`

- home and site URL

  **/!\ differences are made within wp_options table**

  `home_url(); // URL to visit website`

  `site_url(); // URL to WordPress core files`


## Activation hooks

- Plugin activation function: triggered when plugin gets activated
  
  - `$file` - (string) (required) — Path to the primary plugin file 
  - `$function` - (string) (required) — The function to be executed when the plugin is activated

  *Example:*
  
  ```php
    register_activation_hook(__FILE__,'lzp_install');
  ```

- Plugin deactivation function: triggered when plugin gets deactivated
  
  - `$file` - (string) (required) — Path to the primary plugin file 
  - `$function` - (string) (required) — The function to be executed when the plugin is deactivated
  
  *Example:*

  ```php
   register_deactivation_hook(__FILE__,'lzp_deactivate');
  ```
  
  **/!\ DO NOT include uninstall functionnality here (since WP auto update deactivates all plugins)**

## Uninstall

- Method 1 (cleanest) user `uninstall.php` file

  ```php
    if(!defided('WP_UNISTALL_PLUGIN'))
      exit();
  
    // Delete option from options table
    delete_option('lzp_options');
  
    // Remove any additionnal options and custom tables
  ```

- Method 2 (not advised) `register_uninstall_hook($file, $function);`
  **/!\ must be INSIDE activation hook**

  ```php
    register_activation_hook( __FILE__, 'lzp_activate' );
 
    function lzp_activate() {
 
      //register the uninstall function
      register_uninstall_hook( __FILE__, 'lzp_uninstaller' );
 
    }
 
    function lzp_uninstaller() {
 
      //delete any options, tables, etc the plugin created
      delete_option( 'lzp_options' );
 
    }
  ```
  
# Some useful WordPress Links

## WordPress Coding Standards

https://codex.wordpress.org/WordPress_Coding_Standards

以上是关于markdown 有用的WordPress插件片段的主要内容,如果未能解决你的问题,请参考以下文章

markdown WordPress片段

markdown 在WordPress中使用jQuery代码片段

markdown WordPress主题参考,如何,片段,存储库说明

markdown WordPress片段:使用WP CLI检查数据库

markdown 有用的片段

markdown 有用的WordPress分类功能