File "duplicate-menu.php"
Full Path: /home/sasslijg/public_html/wp-content/plugins/duplicate-menu/duplicate-menu.php
File size: 6.52 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/*
Plugin Name: Duplicate Menu
Plugin URI: https://github.com/jchristopher/duplicate-menu
Description: Easily duplicate your WordPress Menus
Author: Jonathan Christopher
Version: 0.2.2
Author URI: https://jonchristopher.us/
*/
/* Copyright 2011-2023 Jonathan Christopher (email : jon@jonchristopher.us)
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
*/
define( 'DUPLICATE_MENU_VERSION', '0.2.2' );
define( 'DUPLICATE_MENU_DIR', plugin_dir_path( __FILE__ ) );
define( 'DUPLICATE_MENU_URL', plugin_dir_url( __FILE__ ) );
/**
* Duplicate Menu
*/
class DuplicateMenu {
function __construct() {
add_action( 'admin_menu', array( $this, 'options_page' ) );
}
function options_page() {
add_theme_page(
'Duplicate Menu',
'Duplicate Menu',
'edit_theme_options',
'duplicate-menu',
array( $this, 'options_screen' )
);
}
/**
* The duplication process
*/
function duplicate( $id = null, $name = null ) {
// sanity check
if ( empty( $id ) || empty( $name ) ) {
return false;
}
$id = intval( $id );
$name = sanitize_text_field( $name );
$source = wp_get_nav_menu_object( $id );
$source_items = wp_get_nav_menu_items( $id );
$new_id = wp_create_nav_menu( $name );
if ( ! $new_id ) {
return false;
}
// key is the original db ID, val is the new
$rel = array();
$i = 1;
foreach ( $source_items as $menu_item ) {
$args = array(
'menu-item-db-id' => $menu_item->db_id,
'menu-item-object-id' => $menu_item->object_id,
'menu-item-object' => $menu_item->object,
'menu-item-position' => $i,
'menu-item-type' => $menu_item->type,
'menu-item-title' => $menu_item->title,
'menu-item-url' => $menu_item->url,
'menu-item-description' => $menu_item->description,
'menu-item-attr-title' => $menu_item->attr_title,
'menu-item-target' => $menu_item->target,
'menu-item-classes' => implode( ' ', $menu_item->classes ),
'menu-item-xfn' => $menu_item->xfn,
'menu-item-status' => $menu_item->post_status
);
$parent_id = wp_update_nav_menu_item( $new_id, 0, $args );
$rel[$menu_item->db_id] = $parent_id;
// did it have a parent? if so, we need to update with the NEW ID
if ( $menu_item->menu_item_parent ) {
$args['menu-item-parent-id'] = $rel[$menu_item->menu_item_parent];
$parent_id = wp_update_nav_menu_item( $new_id, $parent_id, $args );
}
// allow developers to run any custom functionality they'd like
do_action( 'duplicate_menu_item', $menu_item, $args );
$i++;
}
return $new_id;
}
/*
* Output the options screen
*/
function options_screen() {
$nav_menus = wp_get_nav_menus();
?>
<div class="wrap">
<div id="icon-options-general" class="icon32"><br /></div>
<h2><?php _e( 'Duplicate Menu' ); ?></h2>
<?php if ( ! empty( $_POST ) && wp_verify_nonce( $_POST['duplicate_menu_nonce'], 'duplicate_menu' ) ) : ?>
<?php
$source = intval( $_POST['source'] );
$destination = sanitize_text_field( $_POST['new_menu_name'] );
// go ahead and duplicate our menu
$duplicator = new DuplicateMenu();
$new_menu_id = $duplicator->duplicate( $source, $destination );
?>
<div id="message" class="updated"><p>
<?php if ( $new_menu_id ) : ?>
<?php _e( 'Menu Duplicated' ) ?>. <a href="nav-menus.php?action=edit&menu=<?php echo absint( $new_menu_id ); ?>"><?php _e( 'View' ) ?></a>
<?php else: ?>
<?php _e( 'There was a problem duplicating your menu. No action was taken.' ) ?>.
<?php endif; ?>
</p></div>
<?php endif; ?>
<?php if ( empty( $nav_menus ) ) : ?>
<p><?php _e( "You haven't created any Menus yet." ); ?></p>
<?php else: ?>
<form method="post" action="">
<?php wp_nonce_field( 'duplicate_menu','duplicate_menu_nonce' ); ?>
<table class="form-table">
<tr valign="top">
<th scope="row">
<label for="source"><?php _e( 'Duplicate this menu' ); ?>:</label>
</th>
<td>
<select name="source">
<?php foreach ( (array) $nav_menus as $_nav_menu ) : ?>
<option value="<?php echo esc_attr($_nav_menu->term_id) ?>">
<?php echo esc_html( $_nav_menu->name ); ?>
</option>
<?php endforeach; ?>
</select>
<span style="display:inline-block; padding:0 10px;"><?php _e( 'and call it' ); ?></span>
<input name="new_menu_name" type="text" id="new_menu_name" value="" class="regular-text" />
</td>
</table>
<p class="submit">
<input type="submit" name="submit" id="submit" class="button-primary" value="Duplicate Menu" />
</p>
</form>
<?php endif; ?>
</div>
<?php }
}
new DuplicateMenu();