将动态数字辅助模块发送到自定义模板

时间:2019-10-21 作者:Julix

如何使WordPress对url所在的任何请求使用模板/careers/[0-9]+?

我们过去常常为职位空缺定制职位,由single-jobs.php - 然后切换到一个具有良好REST API的申请人跟踪系统,这意味着我们这边的数据库中不再有职位。

我考虑过为第三方API的参数创建一个带有查询字符串的单个作业页面(bla.com/careers/job?id=123). A.page-job.php 然后,模板将读取参数并用于从ATS API请求数据,然后相应地回显页面。

但出于SEO原因,我希望路由具有“适当”的段塞,例如bla.com/careers/123.

除了使用JavaScript更改/伪造url外观之外,我是否需要基本上按照上面的建议执行操作,或者是否有一种后端方法可以做到这一点?

我如何做到这一点?

<小时/>

Update:

在聊天中与Howdy\\u McGee的对话显示,我正在寻找的内容(内容不是通过WordPress仪表板管理的,而是正好适合的)被称为“虚拟页面”,根据medium article.

2 个回复
SO网友:Howdy_McGee

最简单的方法是简单地创建custom rewrite endpoint. 这是一张双人票。它将一次性创建实际的永久链接结构和查询变量。

请注意,创建以下内容后,您需要重新保存永久链接:设置->永久链接->保存按钮。

/**
 * Create Careers Endpoint
 * 
 * @return void
 */
function prefix_careers_endpoint() {

    add_rewrite_endpoint(
        \'careers\',  // Permalink Endpoint
        EP_PAGES,   // Use `EP_ROOT` for more complex permalink strucures such as `careers/job`
        \'jobid\'     // Custom Query Var ( if not passed, defaults to Endpoint - first parameter `careers` )
    );

}
add_action( \'init\', \'prefix_careers_endpoint\' );
接下来我们可以检查global $wp_query 查询变量的存在。如果存在,我们将使用自己选择的模板切换当前模板。在这种情况下,它将在主题中查找endpoint-careers.php.

/**
 * Include template if query var exists
 * 
 * @param String $template
 * 
 * @return String $template
 */
function prefix_careers_template( $template ) {

    global $wp_query;

    // Ensure our `jobid` query var exists and is not empty
    if( \'\' !== $wp_query->get( \'jobid\' ) ) {

        // Ensure our template file exists
        if( \'\' !== ( $new_template = locate_template( \'endpoint-careers.php\' ) ) ) {
            $template = $new_template; // Assign templae file path from conditional
        }

    }

    return $template;

}
add_filter( \'template_include\', \'prefix_careers_template\' );
最后,在自定义模板文件中endpoint-careers.php 之后get_header() 我们可以创建和调用自定义函数prefix_get_data() 将从global $wp_query 然后做一个wp_remote_get() 通过API传递作业ID。这将有希望返回有用的数据,然后我们可以在模板中使用。

/**
 * Return data from external API
 * 
 * @param Integer $jobid
 * 
 * @return Array
 */
function prefix_get_data( $jobid = 0 ) {

    global $wp_query;

    $jobid = ( ! empty( $jobid ) ) ? $wp_query->get( \'jobid\', $jobid ) : $jobid;

    $response = wp_remote_get( \'http://foobar.url\', array(
        \'body\' => array(
            \'jobid\' => $jobid,
        )
    ) );

    return json_decode( $response );

}
称之为$data = prefix_get_data(). 您可能需要修改此函数,具体取决于您的API期望获得的内容和API返回的内容。您甚至可以使用直观的方法创建一个自定义类来处理和调用数据。可能性是无限的!

SO网友:Julix

接收url的最简单后端方式如下/careers/123 内部处理为/careers/job?position_id=123 并返回这些内容,而不实际重新定向/更改url是“url重写”。起初我以为这些只是文件名,但实际上它们非常强大。

这为我做到了:

    add_action( \'init\', \'job_rewrite\' );

    function job_rewrite() {
        global $wp;
        global $wp_rewrite;
        $wp->add_query_var(\'position_id\');
        $rule = \'^careers/(\\d+)/?$\';
        $job_page_id = [job-page id here];
        $rewrite = \'index.php?page_id=\' . $job_page_id . \'&position_id=$matches[1]\'; //job/?id=
        add_rewrite_rule( $rule, $rewrite, \'top\' );
        $wp_rewrite->flush_rules();
    }
然后我所要做的就是在page-job.php 模板文件。

global $wp;
$position_id = $wp->query_vars[\'position_id\'];
// handle the API request with the ID

相关推荐

Updating modified templates

我想调整一些。php模板文件在我的WordPress主题中,我知道正确的过程是将相关文件复制到子主题文件夹中并在那里编辑文件,这样我的修改就不会在将来的主题更新中丢失。但这是否意味着我将无法从主题更新中获益,因为我将文件放在了我的子主题文件夹中?这可能不是一件好事,因为主题更新可能添加了一些有用的特性,甚至修复了我最初需要对代码进行调整的问题!这方面的常见解决方案是什么?有人推荐了一款Diff应用程序——这是人们常用的吗?