动态更改页面的the_title()


9

我正在开发一个不使用自定义帖子类型,而是使用单独的数据库表的插件。它是一个插件,它显示课程列表,并带有指向不同课程详细信息页面的链接,然后用户可以在其中订阅课程。

在当前状态下,我正在使用简码将插件数据放入具有自定义页面模板(page-courses.php)的页面中。

我现在要the_title()根据插件显示的页面(课程列表,带有表单的课程详细信息页面,表单提交成功页面)进行动态更改。但是只要我使用以下过滤器执行此操作,到页脚中其他页面的链接也会更改:

<?php

add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Custom Title';
}

编辑

在footer.php中,我具有一个包含页脚链接的函数,wp_nav_menu()因此可以在外观>菜单中对其进行定义。但是,使用上面的过滤器后,页脚中的所有链接也会更改为“自定义标题”。但我只想更改页面标题,而不影响页脚中的菜单链接。

试图添加条件标记in_the_loop()的页脚链接仍然受到影响,尽管它们不在循环中。

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    if ( in_the_loop() ) {
        add_filter( 'the_title', 'custom_page_title' );
    }
}

function custom_page_title() {
    return 'Custom Title';
}

类似于这个问题:在nav中过滤the_title问题,只是受影响的链接在页脚中,in_the_loop()并且不起作用。

我如何更改the_title()而只影响显示的当前页面标题而不影响页脚中的链接

编辑2-解决方案

所以我终于让它工作了:

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
}

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-listcourses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}

文件page-listcourses.php是一个自定义帖子模板,我将其分配给名为“课程”的静态页面。

我认为以前没有用,因为静态页面的名称和“自定义帖子模板”的文件名是相同的。


1
为什么要滚动自己的数据库表?如果您将自定义内容实现为“ 自定义帖子类型”,您的生活将变得更加简单。
Chip Bennett

我实际上以为这个问题会来。我开发此插件是为了了解Wordpress,因此我首先不了解自定义帖子类型。我有两个数据库表,一个用于课程,一个用于课程类别。一个类别可以有几门课程,因此两个表是链接的。我认为使用“自定义帖子类型”来完成它并不容易。当然,我可以为课程使用自定义分类法,但是我必须添加更多字段,因为课程类别不仅具有名称。就目前而言,使用自定义数据库表进行操作要容易得多。
Gchtr

1
您的用例是“ 自定义帖子类型”和“自定义分类法” 的确切预期用例。您可能会以为CPT和自定义分类法的优雅,灵活性和强大功能。
Chip Bennett

我确实有可能这样做。我应该尝试一下。感谢您的建议。
Gchtr

in_the_loop()设置为true每当the_post()触发时。没有深入研究内核,也不知道导航菜单本身就是循环,我猜测在此过程中的某个地方会wp_nav_menu()实例化一个循环,从而导致in_the_loop()返回true
Chip Bennett

Answers:


5

我将使用is_page_template()条件:

if ( is_page_template( 'page-courses.php' ) ) {
    // The current page uses your
    // custom page template;
    // do something
}

编辑

您可以过滤器回调中使用此条件:

function wpse83525_filter_the_title( $title ) {
    if ( is_page_template( 'page-courses.php' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

现在,隔离仅是使用网页模板页面的标题,你可以利用传递给其他参数the_title$id。由于您知道要过滤标题的帖子的ID,因此可以查询_wp_page_template帖子的元数据,并确保它等于页面模板:

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );

编辑2

如果要专门定位“课程”页面,请is_page()与页面slug 'courses'或页面标题一起使用'Courses'

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Courses' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

但是,我建议更改page-courses.php为“ 自定义页面模板”,这将使整个过程更加健壮。


这暂时不起作用。但是我完善了我的问题,因为它可能不够具体。也许问题出在其他地方。
Gchtr 2013年

所说的“暂时不起作用什么意思?什么正是你试试?您期望发生什么,没有发生,还是发生了意外?
Chip Bennett

请参阅更新的答案,该答案应解决导航菜单项的标题。
Chip Bennett

我说这是因为我认为您的答案可能是正确的方向(朝正确的方向推动),但我可能没有足够清楚地提出我的问题。get_post_meta( $id, '_wp_page_template', true )返回default,我不知道该怎么办。当我将'page-courses.php'设置为'default'时,所有导航链接都会更改,除非我将the_title过滤器挂钩到loop_start,否则仅页脚链接会更改。我检查了使用的模板文件,它是“ page-courses.php”而不是“ page.php”(我认为这可能是默认文件)。
Gchtr 2013年

那么,“课程”是您静态页面的名称吗?
Chip Bennett

1

如果只想编辑当前页面标题,请使用in_the_loop()条件,如:

add_filter( 'the_title', 'modify_onpage_title', 10, 2);

function modify_onpage_title( $title , $id = null ) {

    if(!in_the_loop()){
        // returns early if not relevant (as in custom menu loops)
        return $title;
    }

    // Tweak your title
    $title = "Yolo! ". $title;
    return $title;
}


0

虽然is_page_template()可以使用,但我更喜欢将这种代码放在页面模板本身中,以便将生成这种页面的所有代码都放在一个文件中。


1
在有问题的代码使用的假设下,它将如何工作the_title()?代码示例?
Chip Bennett

@ChipBennett,我不明白这个问题。如果他需要仅将过滤器应用于具有特定模板的页面,则可以在调用之前将相同的代码放入模板中get_header()
马克·卡普伦

是的,实际上我也认为这会起作用。但是,我认为我必须绕道而行才能在可在query_vars中使用的插件中设置一个变量?所以对我来说,过滤the_title是一个更好的解决方案。
Gchtr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.