我已经创建了可以工作但编码不完美的短码

时间:2020-09-02 作者:Olivier

我想创建一个快捷码,如果用户meta等于某个值,则在其中显示内容

它可以工作,但它的代码并不完美

你会怎么做?如何改进它?

firstname用户为Jeff时的内容显示示例

[check-if-equal usermeta="firstname" uservalue="Jeff"] Yes [/check-if-equal]
这是处理上述短代码的代码

<?php
function func_check_if_equal( $atts, $content = null ) { 
if ( is_user_logged_in() ) { /* check if logged in */

    $user_meta = $atts[\'usermeta\'];
    $user_value = $atts[\'uservalue\'];



    /* get value from shortcode parameter */
    $user_id = get_current_user_id(); /* get user id */
    $user_data = get_userdata( $user_id ); /* get user meta */
    if ( $user_data->$user_meta == $user_value ) { /* if user meta is equal meta value */
        return $content; /* show content from shortcode */
    } else {
        return \'\'; /* meta field don\'t equal */ }
    } else {
        return \'\'; /* user is not logged in */
    }
}
}
add_shortcode( \'check-if-equal\', \'func_check_if_equal\' );
谢谢

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

因此,有两件事是错误的。

首先,您的短代码本身是错误的。

您使用

[check-if-equal usermeta="firstname" uservalue="Jeff"] Yes [/check-if-equal]
但没有什么比firstname 在Wordpress中first_name

所以你的短代码应该是这样的,

[check-if-equal usermeta="first_name" uservalue="Jeff"] Yes [/check-if-equal]
完成后,rest看起来很酷。为了正确格式化语法,我编辑了问题本身。所以应该是这样的:


<?php
function func_check_if_equal( $atts, $content = null ) { 
if ( is_user_logged_in() ) { /* check if logged in */

    $user_meta = $atts[\'usermeta\'];
    $user_value = $atts[\'uservalue\'];


    /* get value from shortcode parameter */
    $user_id = get_current_user_id(); /* get user id */
    $user_data = get_userdata( $user_id ); /* get user meta */
    if ( $user_data->$user_meta == $user_value ) { /* if user meta is equal meta value */
        return $content; /* show content from shortcode */
    } else {
        return \'\'; /* meta field don\'t equal */ }
    } else {
        return \'\'; /* user is not logged in */
    }
}
add_shortcode( \'check-if-equal\', \'func_check_if_equal\' );
您还要求我改进代码,因此有两件事可以改进。

它应该工作得很好,但你错过的第一件事是,可能有人使用了短代码和类型;“jeff”;而不是;“Jeff”;或者他们可能会写道;“JEFF”;而不是;杰夫;。这可能会有问题,因为它们键入相同的名称,但条件仍然不匹配,因此下面我首先将其用于所有大写小变体,然后删除不必要的其他变体。

其次,您不必要地弄乱了else语句,可以用更简单的方法来完成。这两件事都得到了纠正。

function func_check_if_equal( $atts, $content = null ) { 
    if ( is_user_logged_in() ) { /* check if logged in */

        $user_meta = $atts[\'usermeta\'];
        $user_value = $atts[\'uservalue\'];


        /* get value from shortcode parameter */
        $user_id = get_current_user_id(); /* get user id */
        $user_data = get_userdata( $user_id ); /* get user meta */
        if ( strtolower($user_data->$user_meta) == strtolower($user_value) ) { /* if user meta is equal meta value */
            return $content; /* show content from shortcode */
        }
    }
return \'\';
}
add_shortcode( \'check-if-equal\', \'func_check_if_equal\' );

SO网友:jxxe

您可以稍微清理一下代码,但您所做的一切都没有那么糟糕。

function prfx_conditional_user_content( $attributes, $content = null ) {

    if( is_user_logged_in() ) {
        $meta = $attributes[\'meta\'];
        $value = $attributes[\'value\'];
        $current_user_meta = get_userdata( get_current_user_id() );

        if( $current_user_meta->$meta === $value ) {
            return $content;
        }
    }

    return \'\';

}

add_shortcode( \'conditional-content\', \'prfx_conditional_user_content\' );
编辑:正如阿迪蒂亚所指出的,firstname 不是有效属性。正确的是first_name. Here 是WP用户对象可用于您的属性列表。

相关推荐

What does this shortcode do?

function my_shortcode($atts, $content = null){ extract(shortcode_atts(array(\"type\" => \"warrning\"), $atts)); return \".$content.\"; } add_shortcode(\"warrning_dialog\", \"my_shortcode\"); 我知道它会创建短代码[warning\\u dialo