我的客户是一名大学教授,他希望在他的Wordpress支持的网站上为他的学生添加在线测验等等。因此,我构建了一个自定义插件,允许他或任何管理员从管理页面进行这些测验。所有这些信息都保存在自己的表中的mysql数据库中,这里没问题。在向我丢失的博客的学生/普通用户展示测验时。
我想要的是一种生成这些测验的方法。首先,我想出一个$_GET
参数,其中包含学生想要做的测验ID,但是那时,哪个会去哪里?我应该在wordpress的主目录中使用单独的php文件(甚至可以工作)?
我应该创建一个常规的旧帖子并使用短代码拍打代码吗?我应该使用自定义帖子类型吗? (但是请记住测验已经在数据库中创建了,我觉得为每个测验做一个帖子,自定义或常规,看起来过于复杂。你甚至可以创建一个wordpress页面动态并传递参数吗?)
或者有没有办法使用钩子来重写主页面以显示我的代码而不是循环(或任何其他地方)?或者我太遥远了,还有另一种方法吗?
答案 0 :(得分:1)
您可以像使用自定义模板一样轻松完成。例如,创建一个名为“Quiz”的页面和一个名为quiz.php的自定义模板。在该模板中,您只需在查询字符串中查找测验ID,然后显示它:
if($_GET['quiz_id']){
/** code to retrieve and output the quiz */
}
else{
/** code for them to select a quiz */
}
这是一个简单的方法。要以更加流畅的方式执行此操作,您可能会使用重写端点API(http://codex.wordpress.org/Rewrite_API/add_rewrite_endpoint)
之类的东西。一个例子是:
/** add a custom function to the init hook */
add_action('init', 'my_custom_endpoint');
/** custom endpoint for handling forms */
function my_custom_endpoint(){
add_rewrite_endpoint('forms', EP_ALL);
/** when pages are loaded, check to see if it's a form page and do something */
add_action( 'template_redirect', 'process_form' );
}
EP_ALL是端点掩码 - 它告诉WordPress应用新端点的位置。您可以将它仅应用于页面,仅应用于帖子等。在这种情况下,您将在任何地方添加端点。
然后你有一个实际处理端点的函数:
function process_form(){
global $wp_query;
/** check for your endpoint. A URL like site.com/forms/12 would set forms = 12 */
if(isset($wp_query->query_vars['forms'])){
/** the query var forms has a value, do something to show the form */
echo get_form($wp_query->query_vars['forms']);
}
}