我创建了一个wordpress插件,在the_content
上有一个过滤器,查找特定标签,然后输出插件内容代替该标签。
我现在想使用重写规则调用插件并在模板中输出数据,但我找不到太多帮助。
有人可以提供一个示例,或者说明如何使用内置的wp方法添加重写规则,并在插件中调用我的方法来输出一些内容。
理想情况下,我希望shop/
匹配,然后在购物后将所有内容传递到我的插件上的调度方法,以便我可以shop/category/shirts
或shop/product/the-cool-shirt
。我的调度方法将处理拆分其余的url并相应地调用方法。
答案 0 :(得分:0)
这可能会变得相当有趣。我不得不一次为插件做这个,我没有在我面前,所以这是内存不足,但一般的想法应该是正确的。
<?php
add_action('init', 'rewrite_rules');
function rewrite_rules() {
global $wp, $wp_rewrite;
$wp_rewrite->add_rule('(widget1|widget2|widget3)/([a-zA-Z0-9_-]{3,50})$', 'index.php?pagename=listing&category=$matches[1]&subcategory=$matches[2]', 'top' );
$wp->add_query_var( 'category' );
$wp->add_query_var( 'subcategory' );
$wp_rewrite->flush_rules();
}
?>
使用正则表达式本身就是一项重大任务,我相信我使用了这个网站:http://tools.netshiftmedia.com/regexlibrary/来寻求帮助。
我还使用FakePage插件来实际显示我自定义的“动态”页面,正如我所说的那样,但我想WP中的所有内容都是技术上动态的。
http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/
如果您需要更多帮助,请与我联系。
答案 1 :(得分:0)
我不久前做了一些非常相似的事情,我是通过作弊做到的。
如果您发现内置重写规则过于复杂或无法完成工作,您可能会发现捕获请求并过滤结果更容易。简化版本:
add_action('parse_request', 'my_parse_request');
function my_parse_request (&$wp) {
$path = $wp->request;
$groups = array();
if (preg_match("%shop/product/([a-zA-Z0-9-]+)%", $path, $groups)) {
$code = $groups[1];
$product = get_product($code); // your own code here
if (isset($product)) {
add_filter('the_posts', 'my_product_filter_posts');
}
}
}
function my_product_filter_posts ($posts) {
ob_start();
echo "stuff goes here"; // your body here
$content = ob_get_contents();
ob_end_clean();
return array(new DummyResult(0, "Product name", $content));
}
解释:
在数据库查找之前调用parse_request
上的操作。根据URL,它会安装其他操作和过滤器。
帖子上的过滤器会使用虚假结果替换数据库查找的结果。
DummyResult是一个简单的类,它与一个帖子具有相同的字段,或者只是足以让它远离它:
class DummyResult {
public $ID;
public $post_title;
public $post_content;
public $post_author;
public $comment_status = "closed";
public $post_status = "publish";
public $ping_status = "closed";
public $post_type = "page";
public $post_date = "";
function __construct ($ID, $title, $content) {
$this->ID = $ID;
$this->post_title = $title;
$this->post_content = $content;
$this->post_author = get_default_author(); // implement this function
}
}
上面的读者还有很多功课,但这是一种丑陋的工作方法。您可能希望为template_redirect
添加过滤器,以使用特定于产品的模板替换普通页面模板。如果你想要非常永久的链接,你可能需要调整URL正则表达式。