Wordpress:将URL参数传递给shortcode以创建动态页面(无需编辑模板&x27;s functions.php)
在你告诉我这个问题已经被问了几十次之前,让我说我在这里和其他地方读了三十多篇文章。要么解释不全面、含糊不清,要么建议的代码不符合我的需要,例如,建议编辑模板(我读到的不是最佳实践)。我将解释我想做什么,然后展示我已经拥有的代码。我在Wordpress的工作经历是两天,请耐心等待 我已经开始写一个插件(这样我就可以使用它而不管主题如何)。我使用的是一个类,而不是直接在插件的php文件中编写函数 我使用的第一个函数查询数据库,以获取包含转换器列表的数组。然后我将这个数组传递给另一个函数来处理数组,并将其放入一个列表中(使用HTMLWordpress:将URL参数传递给shortcode以创建动态页面(无需编辑模板&x27;s functions.php),php,wordpress,shortcode,Php,Wordpress,Shortcode,在你告诉我这个问题已经被问了几十次之前,让我说我在这里和其他地方读了三十多篇文章。要么解释不全面、含糊不清,要么建议的代码不符合我的需要,例如,建议编辑模板(我读到的不是最佳实践)。我将解释我想做什么,然后展示我已经拥有的代码。我在Wordpress的工作经历是两天,请耐心等待 我已经开始写一个插件(这样我就可以使用它而不管主题如何)。我使用的是一个类,而不是直接在插件的php文件中编写函数 我使用的第一个函数查询数据库,以获取包含转换器列表的数组。然后我将这个数组传递给另一个函数来处理数组,并
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> — ".$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." — ".$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&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." — ".$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." — ".$result->city."</p>";
$list .= "<p>Превежда от и на ".$result->langNameBG." език.</p>";
$list .= "<p>".$result->email.", ".$result->phone.", ".$result->address."</p>";
}
}
return $list;
}