创建更改URL端点的简码

时间:2019-08-30 02:59:38

标签: wordpress api shortcode

我正在从api调用数据,并将其作为数组循环遍历。问题是我只想一次只调用一个个人档案,而每个个人档案都有一个简码。我已经创建了简码功能,它确实起作用。但是,我必须调用循环中的所有配置文件,或者仅通过if语句调用其中一个。这显然不是我想要的。我希望能够在端点URL的末尾添加:player_number = 664(例如)。

我正在使用简码,但不是我需要的。

function individualPlayer(){
        $html .= '<div class="s-players">
                    <div class="container">';

        $responseindividualPlayer = wp_remote_get('http://api-address-hidden-for-security/statsajax.php?action=rankedplayerslist&eventid=5');

        $array = json_decode(utf8_encode($responseindividualPlayer['body']),TRUE);
        foreach($array as $player){
            if($player['Numero'] == 707) {
            $html .= '
                <p>'.$player['Evento'].'</p>
                <p>'.(int)$player['Numero'].'</p>
                <p>'.$player['Jugador'].'</p>';
            }
        }
     return $html .'</div></div>';
    }
    add_shortcode('individualPlayer', 'individualPlayer');

我想删除if语句。 该URL给出了事件ID,后跟?player_number =,然后是玩家编号。

如果可能的话,我很想拥有[shortcode 'player_number=123']。如果不可能,请有人帮助我确定正确的方向吗? 先感谢您。 埃里克·罗伯斯(Erik Robles)

2 个答案:

答案 0 :(得分:1)

首先,您需要将播放器编号作为参数传递给personalPlayer函数。可以完成以下操作:

function individualPlayer($attrs = []){
    # Normalize the case
    $attrs = array_change_key_case((array)$attrs, CASE_LOWER);
    $playerId = $attrs['playerid'];

短代码调用:

[individualPlayer playerid="123"]

接下来,我们需要将结果过滤为所需的播放器。如果API支持按玩家编号过滤,请以必需的格式将$ playerId传递给端点。例如,如果API接受玩家ID作为名为pid的查询字符串参数,则我们可以如下设置端点:

$responseindividualPlayer = wp_remote_get('http://api-address-hidden-for-security/statsajax.php?action=rankedplayerslist&eventid=5&pid=' . $playerId);

如果它不支持API端过滤,则您必须自己做(循环搜索结果并选择具有匹配ID的记录)。

foreach($array as $player){
    if($player['Numero'] == $playerId) {
        # etc.

答案 1 :(得分:0)

感谢KrzysiekDróżdż帮助我解决这个问题。

class Remote_Player_API {
    private static $instance;

    private $remote_data;

    public static function init() {
        if ( ! self::$instance ) {
            self::$instance = new Remote_Player_API();
        }
    }

    protected function __construct() {
        $this->register_shortcodes();
    }

    protected function get_remote_api_data() {
        // you can also use transients here and cache remote responses for some time to optimize API calls even more
        if ( ! $this->remote_data ) {  // obtain remote data only, if we haven't done it already, so the request will be done only once
            $response = wp_remote_get('http://api-address-hidden-for-security/statsajax.php?action=rankedplayerslist&eventid=5');
            $this->remote_data = json_decode( utf8_encode( $response['body'] ), TRUE );
        }
        return $this->remote_data;
    }

    protected function register_shortcodes() {
        add_shortcode( 'individualPlayer', array( $this, 'shortcode_callback_individualPlayer' ) );
    }

    public function shortcode_callback_individualPlayer( $atts ) {
        $atts = shortcode_atts( array(
            'player_number' => 0,  // you have to pass player_number as attribute
        ), $atts );
        ob_start();
        ?>
        <div class="s-players">
            <div class="container">
                <?php
                    foreach ( $this->get_remote_api_data() as $player ) :
                        if ( $player['Numero'] != $atts['player_number'] ) continue;
                ?>
                <p><?php echo esc_html( $player['Evento'] ); ?></p>
                <p><?php echo (int)$player['Numero']; ?></p>
                <p><?php echo esc_html( $player['Jugador'] ); ?></p>
                <?php endforeach; ?>
            </div>
        </div>
        <?php
        return ob_get_clean();
    }
}
Remote_Player_API::init();