基于用户元显示快捷码

时间:2019-06-30 作者:Subham

我一直在做一个项目,我想根据用户元数据显示一个短代码。我在创建新用户时添加了一个用户元。用户元的默认值设置为false。现在,我的逻辑是检查用户元在登录时是否为“false”。如果值为“false”,我将显示短代码,然后再次将用户元更新为“true”。但是,这是行不通的。新创建的用户登录时,无法看到任何短代码。能发现我的错误吗?

This code adds user meta for all the newly created users

add_filter( \'insert_user_meta\', \'new_user_meta\', 20, 3);
function new_user_meta( $meta, $user, $update ) 
{
    if ( $update )
        return $meta;

    $meta[\'GDPR_TERMS_READ\'] = false;
    return $meta;
}

This piece of code checks whether the user meta is false or not to Display the shortcode

add_action( \'init\', \'gdpr_flag\' );
function gdpr_flag() {
  $current_user = get_current_user_id();
  if ( ! $current_user ) {
    // user not logged in
    return;
  }
  if ( get_user_meta( $current_user, \'GDPR_TERMS_READ\', true ) ) {
    // user meta set already
    return;
  }
  // render some html
  echo do_shortcode( \'[wpterms id="2230"]\' );
  // update user meta
  updateHasReadFlag( $current_user );  
}

function updateHasReadFlag($user) {
  // I added support for using this function either with user ID or user object
  if ( $user && is_int( $user ) ) {
    $user_id = $user;
  } else if ( ! empty( $user->ID ) ) {
    $user_id = $user->ID;
  } else {
    return;
  }
  return update_user_meta( $user_id, \'GDPR_TERMS_READ\', true );
}

This is the code generated for pop up from the plugin

<div id="tlight" class="tbrightcontent">
    <div class="termspopupcontainer">
                <h3 class="termstitle">GDPR</h3>

        <div class="termscontentwrapper">
            <p>This is a GDPR pop up.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<form><input name="accept" type="checkbox" value="Gdpr">I accept the GDPR</form>
        </div>


        <form method="post">
                        <div class="tthebutton">
                <input class="termsagree" name="wptp_agree" type="submit" value="Accept">
                <input class="termsdecline" type="button" onclick="window.location.replace(\'https://google.com\')" value="I Do Not Agree">
            </div>
        </form>
    </div>
</div>

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

我假设您使用的短代码呈现了一些html。如果是这种情况,那么您可以考虑将您的函数挂接到以后的某个操作,可能是主题中的某个操作,以便将短代码内容与所有其他html一起呈现。你甚至可以考虑使用wp_footer, 如果这样晚钩是可以的。

你可以这样写你的函数,

add_action( \'some_theme_hook\', \'gdpr_flag\' );

function gdpr_flag() {
  $current_user = get_current_user_id();
  if ( ! $current_user ) {
    // user not logged in
    return;
  }
  if ( get_user_meta( $current_user, \'HAS_READ\', true ) ) {
    // user meta set already
    return;
  }
  // render some html
  echo do_shortcode( "[wpterms id=2230]" );
  // update user meta
  updateHasReadFlag( $current_user );  
}

function updateHasReadFlag($user) {
  // I added support for using this function either with user ID or user object
  if ( $user && is_int( $user ) ) {
    $user_id = $user
  } else if ( ! empty( $user->ID ) ) {
    $user_id = $user->ID;
  } else {
    return;
  }
  return update_user_meta( $user_id, \'HAS_READ\', true );
}
P.S.“HAS\\u READ”并不能说明元数据的用途,因此您可能需要考虑重命名元键。尤其是如果其他开发人员碰巧查看了您的代码或稍后使用了用户元。也许使用诸如“gdpr\\u term\\u read”之类的内容可以更加明确