从任何地方调用函数,在不同的地方使用

时间:2019-08-20 作者:BruceBrain21

我有一个当前运行正常的功能。

它目前位于“我的帐户”部分,并按预期工作。从位于前端的下拉菜单更改后端的用户元信息。

问题是,我希望这个下拉列表可以在我喜欢的任何地方调用,并正常运行。例如,它在“我的帐户”中工作,但我也希望它出现在主页和其他几个地方。

在“我的帐户”中工作的代码:

// -------------------------------------------
// CHANGE DEFAULT CITY ON FRONTEND DASHBOARD

function location_select_account() { ?>
    <script>
        jQuery(document).ready( function(){
            jQuery(\'#location_select\').select2();
        });
    </script> <?php

    global $current_user;
        // Get New User Meta
        if(isset($_POST[\'location_select\'])) {
            $locationposter = $_POST[\'location_select\'];
            // Update/Create User Meta
            update_user_meta( $current_user->ID, \'location_select\', $locationposter);
            }    
        else {
            // Get User Meta
            $locationposter = get_user_meta( $current_user->ID, \'location_select\', true);
        }
    ?>                              
                                    <form method="POST">
                                        <?php 
                                        //get dropdown saved value
                                        $selectedinfo = get_the_author_meta( \'location_select\', $current_user->ID );
                                        $selected = isset( $selectedinfo[\'location_select\'] ) ? esc_attr( $selectedinfo[\'location_select\'][0] ) :\'\';
                                        ?>
                                        <select name="location_select" id="location_select" style="width:13em;" onchange="this.form.submit()">
                                            <option value="all_of_canada" <?php echo ($selectedinfo == "all_of_canada")?  \'selected="all_of_canada"\' : \'\' ?>>All of Canada</option>
                                            <option value="abbotsford" <?php echo ($selectedinfo == "abbotsford")?  \'selected="abbotsford"\' : \'\' ?>>Abbotsford</option>
                                            <option value="barrie" <?php echo ($selectedinfo == "barrie")?  \'selected="barrie"\' : \'\' ?>>Barrie</option>
                                            <option value="brantford" <?php echo ($selectedinfo == "brantford")?  \'selected="brantford"\' : \'\' ?>>Brantford</option>
                                        </select>                                       
                                    </form>
    <?php
    }

// Add Hook

add_action( \'location_select_account_init\' , \'location_select_account\' );
add_action( \'woocommerce_account_content\' , \'location_select_account_init\' , 5 );

function location_select_account_init() {
    do_action(\'location_select_account_init\');
}

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

如果要在任何地方使用该函数,需要确保:

  • $current_user 始终定义为WP_User 对象,
  • $current_user->ID 与0(零)不同-仅针对登录用户,
  • jQueryselect2() 函数(插件)存在,避免了其他一些页面上的JS错误(其中未启用Select 2)。请参见:How can I check if a jQuery plugin is loaded?.
我还对您的代码进行了一些更改,简化和压缩了代码。

现在,您可以在所有可用的动作挂钩中使用此函数。

您还可以在任何模板或php文件中使用它,只需一行:

location_select_account();
您重新访问的代码:

add_action( \'woocommerce_account_content\' , \'location_select_account\' , 5 );
function location_select_account() {
    global $current_user;

    if( ! is_a( $current_user, \'WP_User\' ) )
        $current_user = wp_get_current_user();

    if( $current_user->ID === 0 ) {
        return; // Exit
    }

    // Get the posted data and update user meta data
    if( isset($_POST[\'location_select\']) ) {
        $locationposter = $_POST[\'location_select\'];
        // Update/Create User Meta
        update_user_meta( $current_user->ID, \'location_select\', $locationposter );
    }
    ?>
    <form method="POST">
        <?php
        //get dropdown saved value
        $selectedinfo = $current_user->location_select;
        ?>
        <select name="location_select" id="location_select" style="width:13em;" onchange="this.form.submit()">
            <option value="all_of_canada" <?php echo ($selectedinfo == "all_of_canada")?  \'selected="all_of_canada"\' : \'\' ?>>All of Canada</option>
            <option value="abbotsford" <?php echo ($selectedinfo == "abbotsford")?  \'selected="abbotsford"\' : \'\' ?>>Abbotsford</option>
            <option value="barrie" <?php echo ($selectedinfo == "barrie")?  \'selected="barrie"\' : \'\' ?>>Barrie</option>
            <option value="brantford" <?php echo ($selectedinfo == "brantford")?  \'selected="brantford"\' : \'\' ?>>Brantford</option>
        </select>
    </form>
    <script>
    jQuery( function($){
        // Check if select2 jQuery plugin is loaded
        if (typeof $().select2 !== \'undefined\') {
            $(\'#location_select\').select2();
        };
    });
    </script>
    <?php
}
代码进入函数。活动子主题(或活动主题)的php文件或插件文件。已测试并正常工作。

<小时>

Bonus - Using the function as a shortcode

add_shortcode( \'location_select\', \'location_select_shortcode\' );
function location_select_shortcode(){
    ob_start(); // Start buffering

    location_select_account();

    return ob_get_clean();
}
代码进入函数。活动子主题(或活动主题)的php文件或插件文件。已测试并正常工作。

USAGE:

1) 在Wordpress编辑器中:

[location_select]
2在php文件中:

echo do_shortcode( "[location_select]" );

相关推荐

初学者问题:通过管理Web界面访问Functions.php以导入自定义帖子类型?

是否可以访问这些功能。php文件仅仅使用管理web界面?我正在尝试访问以前创建的(手动编码的)自定义帖子类型,我不得不跳过很多障碍,因为我无法访问函数中的代码。php文件。我已经浏览了很多帮助页面,但建议的步骤似乎总是涉及到函数。php文件(我无法访问)或使用插件中的导入/导出工具,该插件首先创建了自定义帖子类型(据我所知,没有使用任何插件)。这似乎是一个非常基本的问题,但我一辈子都想不出来。任何帮助都将不胜感激!