Wordpress:将URL参数传递给shortcode以创建动态页面(无需编辑模板&x27;s functions.php)

Wordpress:将URL参数传递给shortcode以创建动态页面(无需编辑模板&x27;s functions.php),php,wordpress,shortcode,Php,Wordpress,Shortcode,在你告诉我这个问题已经被问了几十次之前,让我说我在这里和其他地方读了三十多篇文章。要么解释不全面、含糊不清,要么建议的代码不符合我的需要,例如,建议编辑模板(我读到的不是最佳实践)。我将解释我想做什么,然后展示我已经拥有的代码。我在Wordpress的工作经历是两天,请耐心等待 我已经开始写一个插件(这样我就可以使用它而不管主题如何)。我使用的是一个类,而不是直接在插件的php文件中编写函数 我使用的第一个函数查询数据库,以获取包含转换器列表的数组。然后我将这个数组传递给另一个函数来处理数组,并

在你告诉我这个问题已经被问了几十次之前,让我说我在这里和其他地方读了三十多篇文章。要么解释不全面、含糊不清,要么建议的代码不符合我的需要,例如,建议编辑模板(我读到的不是最佳实践)。我将解释我想做什么,然后展示我已经拥有的代码。我在Wordpress的工作经历是两天,请耐心等待

我已经开始写一个插件(这样我就可以使用它而不管主题如何)。我使用的是一个类,而不是直接在插件的php文件中编写函数

我使用的第一个函数查询数据库,以获取包含转换器列表的数组。然后我将这个数组传递给另一个函数来处理数组,并将其放入一个列表中(使用HTML
ul
li
)。我在翻译人员的名字周围添加了一个锚标记,这样点击它就会打开一个动态页面,显示翻译人员的全部细节

为了完成上述工作,我还有两个功能:一个是查询数据库以获取所有相关细节,另一个是处理生成的数组并对其应用一些基本格式

以上所有内容都在一个类中。在初始化这个类之后,我添加了两个短代码:一个用于格式化的translators列表,它可以按预期工作。另一个是关于译者的细节。这就是我不知道该做什么和怎么做的地方。我确实成功地将翻译人员的ID手动传递给页面,但我希望动态地这样做,以便将
translatorID
传递给快捷代码

class CT_translator {

private function get_translators_list() {
    global $wpdb;
    return $wpdb->get_results(
        $wpdb->prepare("SELECT * FROM translators_details ORDER BY translatorID ASC")
    );
}

public function format_translators_list() {
    $results = $this->get_translators_list();
    $list = "<ul>";
    foreach($results as $result) {
        $list .= "<li><a href=\"/prevodach-info/".$result->translatorID."\">".$result->firstName." ".$result->paternalName." ".$result->familyName."</a> &mdash; ".$result->city."</li>";
    }
    $list .= "</ul>";
    return $list;
}

private function get_translator_details($translatorID) {
    global $wpdb;
    return $wpdb->get_results(
        $wpdb->prepare("SELECT * FROM translators_details WHERE translatorID = %s", $translatorID)
    );
}

public function format_translator_details($translatorID) {
    $results = $this->get_translator_details($translatorID);
    $list = "";
    foreach($results as $result) {
        $list .= "<p>".$result->firstName." ".$result->paternalName." ".$result->familyName." &mdash; ".$result->city."</p>";
        $list .= "<p>".$result->email.", ".$result->phone.", ".$result->address."</p>";
    }
    return $list;
}
}
以下是我在页面中对翻译人员列表的称呼: [列出翻译]

这是查看翻译人员详细信息的手动快捷码: [查看\u translator translatorID=“1”]

我了解到,为了让Wordpress能够识别我的变量(在本例中为
translatorID
),我需要一个函数将此变量添加到Wordpress的现有变量中,例如:

public function add_query_vars($aVars) {
    $aVars[] = "translatorID";
    return $aVars;
}
然后,我需要添加另一个函数来重写URL,以便将最后一部分理解为一个变量:

public function add_rewrite_rules($aRules) {
    $aNewRules = array('prevodach-info/([0-9]+)/?$' => 'index.php?pagename=prevodach-info&amp;translatorID=$matches[1]');
    $aRules = $aNewRules + $aRules;
    return $aRules;
}
当我添加两个过滤器(类外)时:


一切都很顺利!没有加载任何内容,并且存在大量错误。

我从不是StackOverflow成员的人那里得到了帮助,问题得到了解决

事实证明,找到一种方法将URL参数传递到短代码,然后从短代码传递到函数是不必要的。(即使可能,我也不知道是怎么做到的。)

只需使用$\u GET或$\u REQUEST在函数中捕获URL参数。根据我编写PHP代码的拙劣经验,我认为在函数中捕获URL参数是一个错误的决定

下面是修正后的函数:

public function format_translator_details($translatorID = "") {
    if(empty($translatorID)) {
        $translatorID = isset($_GET['translatorID']) ? $_GET['translatorID'] : "";
    }

    $list = "";
    if(!empty($translatorID)) {
        $results = $this->get_translator_details($translatorID);
        foreach($results as $result) {
            $list .= "<p>".$result->firstName." ".$result->paternalName." ".$result->familyName." &mdash; ".$result->city."</p>";
            $list .= "<p>Превежда от и на ".$result->langNameBG." език.</p>";
            $list .= "<p>".$result->email.", ".$result->phone.", ".$result->address."</p>";
        }
    }
    return $list;
}
public function format\u translator\u详细信息($translatorID=”“){
if(空($translatorID)){
$translatorID=isset($\u GET['translatorID'])?$\u GET['translatorID']:“”;
}
$list=“”;
如果(!empty($translatorID)){
$results=$this->get\u translator\u details($translatorID);
foreach($results作为$result){
$list.=“”$result->firstName。”“$result->paternalName。”“$result->familyName。”&mdash;“$result->city。”

”; $list.=“; $list.=“”$result->email.,“$result->phone.”,“$result->address.”

”; } } 返回$list; }

短代码就是
[view\u translator]

错误是什么?我在插件中使用带参数的短代码。我没有添加任何内容来重写规则或查询变量。从你的来信中,我不知道你为什么认为你需要这样做。谢谢你的回复,@PaulSwarthout。也许是因为我不明白短代码是如何工作的。同时,我得到了帮助并解决了问题。我将很快发布解决方案。
add_filter('query_vars', 'add_query_vars');
add_filter('rewrite_rules_array', 'add_rewrite_rules');
public function format_translator_details($translatorID = "") {
    if(empty($translatorID)) {
        $translatorID = isset($_GET['translatorID']) ? $_GET['translatorID'] : "";
    }

    $list = "";
    if(!empty($translatorID)) {
        $results = $this->get_translator_details($translatorID);
        foreach($results as $result) {
            $list .= "<p>".$result->firstName." ".$result->paternalName." ".$result->familyName." &mdash; ".$result->city."</p>";
            $list .= "<p>Превежда от и на ".$result->langNameBG." език.</p>";
            $list .= "<p>".$result->email.", ".$result->phone.", ".$result->address."</p>";
        }
    }
    return $list;
}