被要求帮助朋友在Wordpress网站上显示一些自定义数据,我想这很容易...

拥有一个包含客户数据的表。一个插件的想法是根据当前用户ID查询该表并将其作为简码吐出,以便他们可以将输出放置在任意位置。

经过大量谷歌搜索(我不是编码员)后,我得到了一些有用的东西!问题是,即使对我未经训练的眼睛来说,它看起来也像是个庞然大物,当显然有更聪明的方法时,它会重复查询...。

<?php

  Plugin Name: do stuff

  Description: Do site specific stuff


function spend_data() {

  global $wpdb;

  global $current_user;

  wp_get_current_user();

  $userid = $current_user->ID;

  $spend = $wpdb->get_var ( "SELECT spend FROM mytable WHERE the_id=$userid");

        return $spend;
}

function detail_data() {

  global $wpdb;

  global $current_user;

  wp_get_current_user();

  $userid = $current_user->ID;

  $detail = $wpdb->get_var ( "SELECT detail FROM mytable WHERE the_id=$userid");

        return $programs;
}

add_shortcode('spend', 'spend_data');

add_shortcode('detail', 'detail_data');

/* Stop Adding Functions Below this Line */

最佳答案

我想您可以在短代码之前触发的钩子上查询所有字段,然后将其全部存储在$current_user中。不要忘记用正确的表名替换mytable

function marks_prepare_user_shortcodes () {
    global $wpdb;
    global $current_user;
    $current_user = wp_get_current_user();
    $userid = $current_user->ID;

    $row = $wpdb->get_row( "SELECT * FROM mytable WHERE the_id=".$userid, ARRAY_A);

    $current_user->marks_shortcodes = $row;
}
add_action( 'wp_head', 'marks_prepare_user_shortcodes');


然后您的简码更改为

function spend_data() {
    global $current_user;
    $spend = $current_user->marks_shortcodes['spend'];
    if (!is_null($spend))
        return $spend;
}

function detail_data() {
    global $current_user;
    $detail = $current_user->marks_shortcodes['detail'];
    if (!is_null($detail))
        return $detail;
}

add_shortcode('spend', 'spend_data');
add_shortcode('detail', 'detail_data');


我不确定wp_head是否是正确的/ best最佳选择,您可以尝试一下。我想它在所有短代码之前都会被调用。代码未经测试。

附言附带一提,我认为您的额外用户数据实际上应该存储在wp_usermeta表中,而不是单独的表中。您将使用get_user_meta()检索字段:https://developer.wordpress.org/reference/functions/get_user_meta/

更新资料

除了上面的代码块,您还可以使用以下代码:

function mikes_data_shortcode($atts) {
    global $current_user;

    $atts = array_change_key_case((array)$atts, CASE_LOWER);

    // override default attributes with user attributes
    $actual_atts = shortcode_atts([
                                     'field' => 'YouDidntEnterAFieldNameAsAttribute',
                                 ], $atts);

    $data = $current_user->marks_shortcodes[$actual_atts['field']];
    if (!is_null($data))
        return $data;
}

function mikes_shortcodes_init()
{
    add_shortcode('mikes_data_shortcode', 'mikes_data_shortcode');
}

add_action('init', 'mikes_shortcodes_init');


在这里使用短代码的地方:

[mikes_data_shortcode field="spend"]

要么

[mikes_data_shortcode field="detail"]

10-07 13:15