【问题标题】:Wordpress: Pass URL parameter to shortcode to create a dynamic page (without editing a template's functions.php)Wordpress:将 URL 参数传递给简码以创建动态页面(无需编辑模板的 functions.php)
【发布时间】:2021-04-06 09:11:44
【问题描述】:

在你告诉我这个问题已经被问了几十次之前,让我说我在这里和其他地方阅读了 30 多篇帖子。要么解释是部分和模糊的,要么建议的代码不符合我的需要,例如建议是编辑模板(我读到的不是最佳实践)。我将解释我想要做什么,然后显示我已经拥有的代码。我对 Wordpress 的体验是两天之久,请耐心等待。

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

我的第一个函数是查询数据库以获取一个包含翻译者列表的数组。然后我将此数组传递给另一个函数来处理该数组并将其制成一个列表(使用 HTML ulli)。我在翻译者姓名周围添加了一个锚标记,以便单击它会打开一个动态页面,该页面将显示有关翻译者的完整详细信息。

为了完成上述任务,我还有两个功能:一个是查询数据库以获取所有相关详细信息,另一个是处理结果数组并对其应用一些基本格式。

以上所有内容都在一个类中。启动课程后,我添加了两个简码:一个用于格式化的翻译列表,它按预期工作。另一个是用于翻译者的详细信息。这是我无法弄清楚该做什么以及如何做的地方。我确实成功地将翻译者的 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;
}
}

启动类: $CT_translator = new CT_translator();

添加两个短代码:

add_shortcode("list_translators", array($CT_translator, 'format_translators_list'));

add_shortcode("view_translator", array($CT_translator, 'format_translator_details'));

这就是我在页面中调用翻译者列表的方式: [list_translators]

这是查看译员详细信息的手动简码: [view_translator translateID="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;
}

当我添加两个过滤器时(类外):

add_filter('query_vars', 'add_query_vars');
add_filter('rewrite_rules_array', 'add_rewrite_rules');

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

【问题讨论】:

  • 有什么错误?
  • 我在插件中使用带有参数的简码。我没有添加任何东西来重写规则或 query_vars。从你的文章中我不确定你为什么认为你需要这样做。
  • 感谢您的回复,@PaulSwarthout。也许是因为我不明白简码是如何工作的。同时,我得到了帮助并解决了问题。我会尽快发布解决方案。

标签: php wordpress shortcode


【解决方案1】:

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

结果是找到了一种将 URL 参数传递给简码的方法,然后从简码到函数是没有必要的。 (即使可以,我也不知道是怎么做到的。)

只需使用 $_GET 或 $_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;
}

简码就是[view_translator]

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多