You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

341 lines
10 KiB

<?php
/**
* The Nav Menu Images Plugin
*
* Display image as a menu item content.
*
* @package Nav Menu Images
* @subpackage Main
*/
/**
* Plugin Name: Nav Menu Images
* Plugin URI: http://blog.milandinic.com/wordpress/plugins/nav-menu-images/
* Description: Display image as a menu content.
* Author: Milan Dinić
* Author URI: http://blog.milandinic.com/
* Version: 3.2
* Text Domain: nmi
* Domain Path: /languages/
* License: GPL
*/
/* Exit if accessed directly */
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* Display image as a menu content.
*
* @since 1.0
*/
class Nav_Menu_Images {
/**
* Name of a plugin's file.
*
* @var $plugin_basename
* @since 1.0
* @access protected
*/
protected $plugin_basename;
/**
* Is last menu item of current page.
*
* @var $is_current_item
* @since 3.0
* @access public
*/
public $is_current_item;
/**
* Sets class properties.
*
* @since 1.0
* @access public
*
* @uses add_action() To hook function.
* @uses plugin_basename() To get plugin's file name.
*/
public function __construct() {
// Register init
add_action( 'init', array( $this, 'init' ) );
// Get a basename
$this->plugin_basename = plugin_basename( __FILE__ );
}
/**
* Register actions & filters on init.
*
* @since 1.0
* @access public
*
* @uses add_post_type_support() To enable thumbs for nav menu.
* @uses is_admin() To see if it's admin area.
* @uses Nav_Menu_Images_Admin() To call admin functions.
* @uses add_action() To hook function.
* @uses apply_filters() Calls 'nmi_filter_menu_item_content' to
* overwrite menu item filter.
* @uses add_filter() To hook filters.
* @uses do_action() Calls 'nmi_init'.
*/
public function init() {
// Add thumbnail support to menus
add_post_type_support( 'nav_menu_item', 'thumbnail' );
// Load admin file
if ( is_admin() ) {
require_once get_parent_theme_file_path( WOODMART_FRAMEWORK . '/modules/nav-menu-images/inc/admin.php' );
new Nav_Menu_Images_Admin();
}
// Register AJAX handler
add_action( 'wp_ajax_nmi_added_thumbnail', array( $this, 'ajax_added_thumbnail' ) );
// Register menu item content filter if needed
if ( apply_filters( 'nmi_filter_menu_item_content', true ) ) {
//add_filter( 'nav_menu_css_class', array( $this, 'register_menu_item_filter' ), 15, 3 );
//add_filter( 'walker_nav_menu_start_el', array( $this, 'deregister_menu_item_filter' ), 15, 2 );
}
// Register plugins action links filter
add_filter( 'plugin_action_links_' . $this->plugin_basename, array( $this, 'action_links' ) );
add_filter( 'network_admin_plugin_action_links_' . $this->plugin_basename, array( $this, 'action_links' ) );
do_action( 'nmi_init' );
}
/**
* Load textdomain for internationalization.
*
* @since 1.0
* @access public
*
* @uses is_textdomain_loaded() To check if translation is loaded.
* @uses load_plugin_textdomain() To load translation file.
* @uses plugin_basename() To get plugin's file name.
*/
public function load_textdomain() {
/* If translation isn't loaded, load it */
}
/**
* Return thumbnail's HTML after addition.
*
* @since 1.0
* @access public
*
* @uses absint() To get positive integer.
* @uses has_post_thumbnail() To check if item has thumb.
* @uses admin_url() To get URL of uploader.
* @uses esc_url() To escape URL.
* @uses add_query_arg() To append variables to URL.
* @uses get_the_post_thumbnail() To get item's thumb.
*/
public function ajax_added_thumbnail() {
check_ajax_referer( 'woodmart-mega-menu-added-thumbnail-nonce', 'security' );
// Get submitted values
$post_id = isset( $_POST[ 'post_id' ] ) ? sanitize_text_field( absint( $_POST[ 'post_id' ] ) ) : 0;
$thumbnail_id = isset( $_POST[ 'thumbnail_id' ] ) ? sanitize_text_field( absint( $_POST[ 'thumbnail_id' ] ) ) : 0;
// If there aren't values, exit
if ( 0 == $post_id || 0 == $thumbnail_id )
die( '0' );
// If there isn't featured image, exit
if ( ! has_post_thumbnail( $post_id ) )
die( '1' );
// Form upload link
$upload_url = admin_url( 'media-upload.php' );
$query_args = array(
'post_id' => $post_id,
'tab' => 'gallery',
'TB_iframe' => '1',
'width' => '640',
'height' => '425'
);
$upload_url = esc_url( add_query_arg( $query_args, $upload_url ) );
// Item's featured image
$post_thumbnail = get_the_post_thumbnail( $post_id, 'thumb' );
// Full HTML
$return_html = '<a href="' . $upload_url . '" data-id="' . $post_id . '" class="thickbox add_media link-with-image">' . $post_thumbnail . '</a>';
die( $return_html );
}
/**
* Display an image as menu item content.
*
* @since 1.0
* @access public
*
* @uses has_post_thumbnail() To check if item has thumb.
* @uses apply_filters() Calls 'nmi_menu_item_content' to
* filter outputted content.
* @uses get_the_post_thumbnail() To get item's thumb.
*
* @param string $content Item's content
* @param int $item_id Item's ID
* @return string $content Item's content
*/
public function menu_item_content( $content, $item_id ) {
if ( has_post_thumbnail( $item_id ) )
$content = apply_filters( 'nmi_menu_item_content', get_the_post_thumbnail( $item_id, 'full', array( 'alt' => $content, 'title' => $content ) ), $item_id, $content );
return $content;
}
/**
* Display a hover image for menu item image.
*
* @since 3.0
* @access public
*
* Thanks {@link http://www.webmasterworld.com/forum21/6615.htm}
*
* @uses get_post_meta() To get item's hover & active images IDs.
* @uses wp_get_attachment_image_src() To get hover image's data.
* @uses apply_filters() Calls 'nmi_menu_item_hover' to
* filter returned attributes.
*
* @param array $attr Image's attributes.
* @param object $attachment Image's post object data.
* @return array $attr New image's attributes.
*/
public function menu_item_hover( $attr, $attachment ) {
if ( ( $hover_id = get_post_meta( $attachment->post_parent, '_nmi_hover', true ) ) && ! ( $this->is_current_item && get_post_meta( $attachment->post_parent, '_nmi_active', true ) ) ) {
$image = wp_get_attachment_image_src( $hover_id, 'full', false );
$url = $image[0];
$src = $attr['src'];
$attr['onmouseover'] = 'this.src=\'' . $url . '\'';
$attr['onmouseout'] = 'this.src=\'' . $src . '\'';
$attr = apply_filters( 'nmi_menu_item_hover', $attr, $attachment );
}
return $attr;
}
/**
* Display an active image for menu item.
*
* @since 3.0
* @access public
*
* @uses get_post_meta() To get item's active image ID.
* @uses wp_get_attachment_image_src() To get active image's data.
* @uses apply_filters() Calls 'nmi_menu_item_active' to
* filter returned attributes.
*
* @param array $attr Image's attributes.
* @param object $attachment Image's post object data.
* @return array $attr New image's attributes.
*/
public function menu_item_active( $attr, $attachment ) {
if ( $this->is_current_item && ( $active_id = get_post_meta( $attachment->post_parent, '_nmi_active', true ) ) ) {
$image = wp_get_attachment_image_src( $active_id, 'full', false );
$url = $image[0];
$attr['src'] = $url;
$attr = apply_filters( 'nmi_menu_item_active', $attr, $attachment );
}
return $attr;
}
/**
* Register menu item content filter.
*
* Also check if menu item is of
* currently displayed page.
*
* @since 1.0
* @access public
*
* @uses has_post_thumbnail() To check if item has thumb.
* @uses add_filter() To hook filter.
*
* @param array $item_classes Item's classes.
* @param object $item Menu item data object.
* @param object $args Item's arguments.
* @return array $item_classes Item's classes.
*/
public function register_menu_item_filter( $item_classes, $item, $args = array() ) {
if ( has_post_thumbnail( $item->ID ) ) {
// Register filters
add_filter( 'the_title', array( $this, 'menu_item_content' ), 15, 2 );
add_filter( 'wp_get_attachment_image_attributes', array( $this, 'menu_item_hover' ), 15, 2 );
add_filter( 'wp_get_attachment_image_attributes', array( $this, 'menu_item_active' ), 15, 2 );
// Mark current item status
if ( in_array( 'current-menu-item', $item_classes ) )
$this->is_current_item = true;
else
$this->is_current_item = false;
// Add 'has-image' class to the menu item
$item_classes[] = 'has-image';
}
return $item_classes;
}
/**
* Deregister menu item content filter.
*
* @since 1.0
* @access public
*
* @uses remove_action() To unhook filter.
*
* @param string $item_output Item's content
* @param object $item Menu item data object.
* @return string $item_output Item's content
*/
public function deregister_menu_item_filter( $item_output, $item ) {
remove_action( 'the_title', array( $this, 'menu_item_content' ), 15, 2 );
remove_action( 'wp_get_attachment_image_attributes', array( $this, 'menu_item_hover' ), 15, 2 );
remove_action( 'wp_get_attachment_image_attributes', array( $this, 'menu_item_active' ), 15, 2 );
return $item_output;
}
/**
* Add action links to plugins page.
*
* @since 1.0
* @access public
*
* @uses Nav_Menu_Images::load_textdomain() To load translations.
*
* @param array $link Plugin's action links.
* @return array $link Plugin's action links.
*/
public function action_links( $links ) {
// Load translations
$this->load_textdomain();
$links['donate'] = '';
return $links;
}
}
/**
* Initialize a plugin.
*
* Load class when all plugins are loaded
* so that other plugins can overwrite it.
*
* @since 1.0
*
* @uses Nav_Menu_Images To initialize plugin.
*/
function nmi_instantiate() {
new Nav_Menu_Images();
}
add_action( 'after_setup_theme', 'nmi_instantiate', 15 );