创建默认值以在短代码中的 return 中使用 - Wordpress 插件

Create defaults to use in return in shortcode - Wordpress plugin

我正在制作我的第一个 Wordpress 插件,它添加了一个简码,我可以在 header.

中使用

该插件与 Wordpress 选项页面集成。所有与管理相关的工作都很好,包括编写 top wp_options table and/or delete/update 字段。

我的问题出在自定义简码本身(底部)。

我想实现的是,当admin中没有设置get_option('bfcsc_logout_link')时,应该返回一个默认值。

当然,我正在寻找 'nice way',所以我的代码看起来也不错 :) 当插件最终按我想要的方式工作时,我正在考虑更进一步进一步将代码分离到初始化文件等,使其更专业。

完整代码如下(不包括资产):

<?php
/*
Plugin Name: Brokenfruit Custom Login Shortcode
Plugin URI: https://www.brokenfruit.dk/
Description: Adds custom login shortcode for Brokenfruit
Version: 1.0
Author: Kenn Nielsen
Author URI: https://www.brokenfruit.dk/
License: GPL
*/

// Meaning of abbreviations:
// bfclsc = brokenfruit custom login shortcode


/* Register styles and scripts */

function bfcsc_enqueue_scripts() {
    global $wpdb;
    $screen = get_current_screen();

    if ( $screen->id != 'settings_page_brokenfruit-custom-shortcodes' ) 
        return; // exit if incorrect screen id

        wp_enqueue_style( 'brokenfruit-shortcodes-styles', plugins_url( '/css/styles.css', __FILE__ ) );
        wp_enqueue_style( 'bootstrap', plugins_url( '/css/bootstrap.css', __FILE__ ) );
        wp_enqueue_script('admin_js_bootstrap_hack', plugins_url( '/scripts/bootstrap-hack.js', __FILE__ ), false, '1.0.0', false);

}
add_action('admin_enqueue_scripts', 'bfcsc_enqueue_scripts' );

/* Runs when plugin is activated */
register_activation_hook(__FILE__,'bfcsc_install');

/* Runs on plugin deactivation*/
register_deactivation_hook( __FILE__, 'bfcsc_remove' );

function bfcsc_install() {
    /* Creates new database field */
    add_option('bfcsc_logout_link', '', '', 'yes');
    add_option('bfcsc_login_link', '', '', 'yes');
    add_option('bfcsc_account_link', '', '', 'yes');
}

function bfcsc_remove() {
    /* Deletes the database field */
    delete_option('bfcsc_logout_link');
    delete_option('bfcsc_login_link');
    delete_option('bfcsc_account_link');
}

if (is_admin() ) {
    function add_bfcsc_option_page() {
        add_options_page(
            'Brokenfruit Custom Shortcodes',    // The text to be displayed in the title tag
            'Brokenfruit Custom Shortcodes',    // The text to be used for the menu
            'administrator',                    // The capability required to display this menu
            'brokenfruit-custom-shortcodes',    // The unique slug name to refer to this menu
            'bfcsc_html_page');                 // The function tooutput the page content
    }
    /* Call the html code */
    add_action('admin_menu', 'add_bfcsc_option_page');
}

function bfcsc_html_page(){
    ?>
    <form method="post" action="options.php">
    <?php wp_nonce_field('update-options'); ?>
        <div class="bootstrap-wrapper">
            <div class="row top-buffer">
                <div class="col-md-8">
                    <div><h1>Brokenfruit Custom Login Shortcode</h1></div>
                    <p>Til brug for shortcode:<br/><span class="shortcode-preview">[custom_login]</span></p>
                    <div class="top-buffer"></div>
                    <h5>Link til log ud:</h5><input placeholder="Eksempel: wp-login.php?action=logout" class="form-control" name="bfcsc_logout_link" type="text" id="bfcsc_logout_link" value="<?php echo get_option('bfcsc_logout_link'); ?>" /></td>
                    <div class="top-buffer"></div>
                    <h5>Link til log ind:</h5><input placeholder="Eksempel: /log-ind/" class="form-control" name="bfcsc_login_link" type="text" id="bfcsc_login_link" value="<?php echo get_option('bfcsc_login_link'); ?>" /></td>
                    <div class="top-buffer"></div>
                    <h5>Link til min konto:</h5><input placeholder="Eksempel: /min-brokenfruit/" class="form-control" name="bfcsc_account_link" type="text" id="bfcsc_account_link" value="<?php echo get_option('bfcsc_account_link'); ?>" /></td>
                    <input type="hidden" name="action" value="update" />
                    <input type="hidden" name="page_options" value="bfcsc_logout_link,bfcsc_login_link,bfcsc_account_link" />
                    <input class="btn btn-primary top-buffer" type="submit" value="<?php _e('Save Changes') ?>" />
                </div>
            </div>
        </div>
    </form>
    <?php
}

/*---------------------------------------------------*/
/*          Custom login shortcode - start           */
/*---------------------------------------------------*/

function mydefaults (){
    if (!get_option('bfcsc_logout_link')){
        $logout_link = '/log-ud/';
    } else {
        $logout_link = get_option('bfcsc_logout_link');
    }

    if (!get_option('bfcsc_login_link')){
        $login_link = '/log-ind';
    } else {
        $login_link = get_option('bfcsc_login_link');
    }

    if (!get_option('bfcsc_account_link')){
        $account_link = '/min-brokenfruit/';
    } else {
        $account_link = get_option('bfcsc_account_link');
    }
}

function custom_login_shortcode ( $atts ){

    if ( is_user_logged_in() ) {

        return '<a href="' . $account_link . '" class="custom_login"><i class="fa icon-user"></i>Mit Brokenfruit</a> | <a href="' . wp_logout_url( home_url()) . '" class="custom_login"><i class="fa icon-logout"></i>Log ud</a>';

    } else {

        return '<a href="/log-ind/" class="custom_login"><i class="fa icon-login"></i>Log ind</a>';
    }
}
add_shortcode( 'custom_login', 'custom_login_shortcode' );

/*---------------------------------------------------*/
/*          Custom login shortcode - end             */
/*---------------------------------------------------*/

?>

提前谢谢大家! 凯恩干杯

get_option() 有一个默认值的可选参数:

$no_exists_value = get_option( 'no_exists_value', 'default_value' );
var_dump( $no_exists_value ); /* outputs 'default_value' */

https://codex.wordpress.org/Function_Reference/get_option

我找到了解决办法。

我需要将函数 mydefaults 的内容放入函数 custom_login_shortcode。我猜我的变量是在全局状态下创建的,不能使用?

毕竟,我不明白为什么我不能像这样将变量传递到短代码中:

function custom_login_shortcode ( $atts, $logout_link, $login_link, $account_link ){

下面是工作简码函数:

/*---------------------------------------------------*/
/*          Custom login shortcode - start           */
/*---------------------------------------------------*/

/*function mydefaults (){
    if (!get_option('bfclsc_logout_link')){
        $logout_link = '/log-ud/';
    } else {
        $logout_link = get_option('bfclsc_logout_link');
    }

    if (!get_option('bfclsc_login_link')){
        $login_link = '/log-ind';
    } else {
        $login_link = get_option('bfclsc_login_link');
    }

    if (!get_option('bfclsc_account_link')){
        $account_link = '/min-brokenfruit/';
    } else {
        $account_link = get_option('bfclsc_account_link');
    }
}*/

function custom_login_shortcode ( $atts ){

    if (!get_option('bfclsc_logout_link')){
        $logout_link = wp_logout_url( home_url()); //call wordpress logout with home redirect: wp_logout_url( home_url()) 
    } else {
        $logout_link = get_option('bfclsc_logout_link');
    }

    if (!get_option('bfclsc_login_link')){
        $login_link = '/log-ind/';
    } else {
        $login_link = get_option('bfclsc_login_link');
    }

    if (!get_option('bfclsc_account_link')){
        $account_link = '/min-brokenfruit/';
    } else {
        $account_link = get_option('bfclsc_account_link');
    }

    if ( is_user_logged_in() ) {

        return '<a href="' . $account_link . '" class="custom_login"><i class="fa icon-user"></i>Mit Brokenfruit</a> | <a href="' . $logout_link . '" class="custom_login"><i class="fa icon-logout"></i>Log ud</a>';

    } else {

        return '<a href="' . $login_link . '" class="custom_login"><i class="fa icon-login"></i>Log ind</a>';
    }
}
add_shortcode( 'custom_login', 'custom_login_shortcode' );

/*---------------------------------------------------*/
/*          Custom login shortcode - end             */
/*---------------------------------------------------*/

正确。您的变量在该方法中不可用。 至于参数,简码 api 并不意味着那样工作。单独的参数 $atts 用于将短代码(括号内的部分)中所需的变量作为数组传递。 我不确定您打算如何使用简码。但是你可以用

传递你的参数
[custom_login login='different_login' ]

然后在 $atts 数组的短代码中选择它们:

function custom_login_shortcode ( $atts ){
 $a = shortcode_atts( array(
        'login' => '/log-ind/', // default value for login
        'account' => '/min-brokenfruit/', // default value for account
    ), $atts ); 

return $a['login']; // returns 'different_login'
return $a['account'] // returns  '/min-brokenfruit/'

您还可以将变量定义为常量(具有全局范围),以便它们在您的短代码和所有方法中可用: 定义('MY_LOGIN_LINK','/log-ind'); 然后你可以使用 if (!defined('MY_LOGIN_LINK')) 看看你是否有东西可以使用。有关详细信息,请参阅 http://php.net/manual/en/function.define.php

但是如果您只需要在这一个方法中使用这些值,这将在您重写的代码中起作用以稍微简化它: $login_link = get_option('bfclsc_login_link','/log-ind/');