将自定义元添加到导航菜单项

时间:2011-11-13 作者:Dogbert

我需要用“foo”键将元数据附加到每个菜单项。在不编辑核心WP的情况下,是否可以做到这一点?

快速查看nav菜单文件表明,在我要添加输入框的位置附近没有挂钩(下面的描述,这里-http://cl.ly/0v2Z0X1n2e1L431t0h1G)

2 个回复
最合适的回答,由SO网友:Bainternet 整理而成

下面是一个快速代码,可以完成这项工作,将其粘贴到主题的函数中。php文件

基本上,它所做的是隐藏所有常规类输入框,并添加一个新的选择下拉列表,该下拉列表根据所选值更改隐藏输入的值。

看起来是这样的;

enter image description here

function menu_item_class_select(){
    global $pagenow;
    if ($pagenow == "nav-menus.php"){
    ?>
    <script>
    jQuery(document).ready(function(){
        function create_dd(v){
            //create dropdown
            var dd = jQuery(\'<select class="my_class"></select>\');
            //create dropdown options
            //array with the options you want
            var classes = ["","class1","class2","class3"];
            jQuery.each(classes, function(i,val) {
                if (v == val){
                    dd.append(\'<option value="\'+val+\'" selected="selected">\'+val+\'</option>\');
                }else{
                    dd.append(\'<option value="\'+val+\'">\'+val+\'</option>\');
                }
            });
            return dd;
        }

        jQuery(".edit-menu-item-classes").each(function() {
            //add dropdown
            var t = create_dd(jQuery(this).val());
            jQuery(this).before(t);
            //hide all inputs
            jQuery(this).css("display","none");

        });
        //update input on selection
        jQuery(".my_class").bind("change", function() {
            var v = jQuery(this).val();
            var inp = jQuery(this).next();
            inp.attr("value",v);
        });
    });


    </script>
    <?php
    }
}
add_action(\'admin_footer\',\'menu_item_class_select\');

SO网友:Hassan Gilak

此答案位于here 有点过头了。在这种情况下,我宁愿不干扰Walker,所以我的工作涉及到更多的jquery。

add_action(\'wp_update_nav_menu_item\', \'custom_nav_update\', 10, 3);
function custom_nav_update($menu_id, $menu_item_db_id, $args)
{
    if (is_array($_REQUEST[\'menu-item-icon\'])) {
        $custom_value = $_REQUEST[\'menu-item-icon\'][$menu_item_db_id];
        update_post_meta($menu_item_db_id, \'_menu_item_icon\', $custom_value);
    }
}

function menu_item_class_select()
{
    global $pagenow;
    if ($pagenow == "nav-menus.php") {
        ?>
        <script>
            (function ($) {
                $(document).ready(function () {
                    var menu_item_collection = {};
                    var item_holder = $("#menu-to-edit");
                    menu_item_collection.items = item_holder.find("li");

                    // extract id of a menu item from this pattern (menu-item-109)
                    // which 109 is the id
                    function getId(item_id) {
                        var arrayed = item_id.split("-");
                        return arrayed[2];
                    }

                    // return template wrapped in jquery object
                    function extra_field(id, value) {
                        if (value === null) {
                            value = "";
                        }
                        var template = \'<p class="field-title-attribute description description-wide">\' +
                            \'<label for="edit-menu-item-attr-title-108">\' +
                            \'icon\' +
                            \'<input type="text" class="widefat edit-menu-item-attr-title" name="menu-item-icon[\' + id + \']" value="\' + value + \'">\' +
                            \'</label>\' +
                            \'</p>\';

                        return $(template);
                    }

                    // ajax out to get metadata
                    function getMetaData(id, callback) {
                        $.ajax({
                            method: "POST",
                            url: "/wp-admin/admin-ajax.php",
                            data: {id: id, post_type: "menu", action: "menu_metadata"}
                        }).done(function (msg) {
                            callback(msg);
                        }).fail(function (msg) {
                            console.log("failed : " + msg);
                        });
                    }

                    // these lines of codes initialize menus with their custom attributes values
                    if (menu_item_collection.items.length > 0) {
                        var id;
                        menu_item_collection.items.each(function () {
                            id = getId($(this).attr("id"));
                            var _this = $(this);
                            getMetaData(id, function (msg) {
                                var attribute = (_this.find(".field-title-attribute"));
                                if (msg._menu_item_icon === \'undefined\') {
                                    msg._menu_item_icon = "";
                                }
                                attribute.after(extra_field(getId(_this.attr(\'id\')), msg._menu_item_icon[0]));
                                _this.addClass("icon-link-was-added");
                            });
                        });
                    }

                    // this listener interact with adding live menus
                    item_holder.on(\'DOMNodeInserted\', function (e) {
                        try {
                            // sortable script code that they used made me to check upon whether our intended child is li or not
                            // yet i wrap this code into try catch because some nodes was`nt inserted to the dome
                            // and null pointer would cause undefined error some times
                            if (
                                !$(e.target).hasClass("icon-link-was-added") &&
                                $(e.target).is("li") &&
                                $(e.target).attr("id").search(/menu\\-item\\-[0-9]+/) !== -1) {

                                var attribute = ($(e.target).find(".field-title-attribute"));
                                attribute.after(extra_field(getId($(e.target).attr(\'id\'))));
                                $(e.target).addClass("icon-link-was-added");
                            }
                        } catch (e) {
                            // silent
                        }
                    });
                });
            })(jQuery);
        </script>
        <?php
    }
}

add_action(\'admin_footer\', \'menu_item_class_select\');

结束

相关推荐

Thesis -style Navigation

我正在研究一个主题,我希望用户能够像论文一样选择要在主题选项页面中显示的页面。我已经在谷歌上搜索了几个小时的逆向工程论文,但还没有找到一个很好的解决方案。我想知道是否有人做过这件事或看过教程。