在同一页面上多次使用简单的快捷码时页面加载速度较慢

时间:2020-02-18 作者:futurion

我有一个简单的短代码,可以解析URL中的“用户”id,并在一个自定义页面中从另一个mysql db为该用户加载特定数据:

$sql_u = \'user\';
$sql_p = \'password\';
$sql_db = \'database\';
$sql_ip = \'10.10.10.10\';

function fetch_data_func ($atts) {
 global $wpdb,$sql_u,$sql_p,$sql_db,$sql_ip;
 $reg = new wpdb($sql_u,$sql_p,$sql_db,$sql_ip);
 $user = get_query_var(\'user\');
 $result = $reg->get_row($wpdb->prepare("SELECT * from data_table WHERE url_id=%s",$user));
 return $result->{$atts[\'text\']};
}
add_shortcode(\'fetch_data\', \'fetch_data_func\');
这就是我所说的短代码:

Name: [fetch_data text="name"]
Some random text or other WP blocks
Address: [fetch_data text="address"]
Some random text or other WP blocks
City: [fetch_data text="city"]
etc.
我在特定的mysql数据库中为每个用户提供了大约20列,这意味着在wordpress的同一页面的不同部分上有大约20个短代码调用。

由于显而易见的原因,当在一个页面内多次调用短代码时,加载时间会急剧增加。我相信,每次调用短代码时,都会执行对数据库的新查询。因此,当调用20次短代码时,会进行20次查询,总是获取相同的数据,这意味着(在我的情况下)在相当不错的apache服务器上加载大约10秒的页面。

我的问题是,如何修改短代码,使其只执行一次查询,并获取“get\\u row”函数中所需的所有数据,然后在一个页面中多次使用此短代码,而每次都不执行任何额外的新查询。这在这种形式下是可行的还是我应该寻找另一种方法?我还使用get\\u var和多个短代码对此进行了测试,但结果是一样的,很慢。我在这里真的迷路了。

或者更好的问题是,是否可以从同一页面的不同部分多次调用此短代码,而不必每次都执行sql查询?

提前非常感谢您的帮助!

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

PHP和许多其他语言都有一个特殊的结构来组合状态和行为,因为这正是您想要的。该构造称为object.

对象由定义classes. 因此,您需要一个类来记住当前用户数据(状态),并提供您需要的部分(行为)。这可能非常简单。创建一个名为UserData.php 并在注册短代码之前包含它。

文件内容应类似于以下内容:

namespace WPSE;

class UserData
{
    private $user, $sql_u, $sql_p, $sql_db, $sql_ip;

    public function __construct( $sql_u, $sql_p, $sql_db, $sql_ip )
    {
        $this->sql_u = $sql_u;
        $this->sql_u = $sql_p;
        $this->sql_u = $sql_db;
        $this->sql_u = $sql_ip;
    }

    public function fetch( $atts )
    {
        if ( empty ( $this->user ) {
            $this->fetch_user();
        }
        return $this->user->{$atts[\'text\']};
    }

    private function fetch_user()
    {
        $reg         = new \\wpdb( 
                           $this->sql_u, 
                           $this->sql_p, 
                           $this->sql_db, 
                           $this->sql_ip
                       );
        $user_id     = get_query_var(\'user\');
        $this->user  = $reg->get_row(
            $reg->prepare(
                "SELECT * from data_table WHERE url_id=%s",
                $user_id
                )
        );
    }
}
然后将短代码注册到名称空间:

include_once (\'UserData.php\');
$user_data = new \\WPSE\\UserData( $sql_u, $sql_p, $sql_db, $sql_ip );
add_shortcode( \'fetch_data\', [ $user_data, \'fetch\' ] );
请注意,这是完全未经测试的。我只是想给你一个关于如何处理这类案件的想法。

另外,欢迎使用WordPress堆栈交换!:)

SO网友:hamdirizal

可以使用逗号分隔参数并显示一次数据。这样,您可以选择要显示的任何字段。

[fetch_data fields="First Name:first_name,Last Name:last_name,City:city"]
这是shortcode函数:

add_shortcode(\'fetch_data\', \'fetch_data_func\');

function fetch_data_func($attr){
    $user_arr = get_user_data_from_db();//use your own code

    //Split by comma then by colon
    $fields = explode(\',\', $attr[\'fields\']);
    $fields = array_map(function($item){
        $field = explode(\':\', $item);
        return array( \'label\'=>$field[0],\'name\'=>$field[1] );
    }, $fields);

    //Use Output Buffering so you can include template here
    ob_start();
    foreach ($fields as $field) {
        echo $field[\'label\'] . \': \' . $user_arr[$field[\'name\']] . \'<br>\';
        //Will show like this 
        //First name: John
        //City: New York
    }
    return ob_get_clean();
}

相关推荐

Custom Post type shortcodes

我使用高级自定义字段在我的主题中创建自定义帖子类型(功能)。我想知道如何创建自定义帖子类型的短代码。因此,我只使用任何页面的自定义帖子类型的短代码来显示我在自定义帖子类型(功能)中添加的信息。