페이지의 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 및 맞춤 분류법의 우아함, 유연성 및 강력 함을 오해 하고 있을 수 있습니다 .
칩 베넷

실제로 내가 할 수 있습니다. 아마 시도해야합니다. 충고 감사합니다.
Gchtr

in_the_loop()true때마다 설정됩니다 the_post(). 코어에 너무 깊게 파고 내비게이션 메뉴 자체가 루프 라는 것을 알지 못하면 도중에 어딘가 wp_nav_menu()에서 루프를 인스턴스화 in_the_loop()하여 돌아 오는 것으로 추측합니다 true.
칩 베넷

답변:


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()페이지 슬러그 '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

" 지금 작동하지 않았다 " 무슨 뜻 입니까? 정확히 무엇 을 시도 했습니까? 어떤 일이 일어날 것으로 예상 했습니까?
칩 베넷

탐색 메뉴 항목 제목을 다루는 업데이트 된 답변을 참조하십시오.
칩 베넷

나는 당신의 대답이 옳은 것이라고 생각하기 때문에 (올바른 방향으로 밀기), 아마도 내 질문을 충분히 명확하게하지 않았을 것입니다. get_post_meta( $id, '_wp_page_template', true )반환 default및 이걸로 어떻게 해야할지 모르겠어요. 'page-courses.php'를 'default'로 설정하면 the_title필터를 loop_start에 연결하면 바닥 글 링크 만 변경됩니다. 어떤 템플릿 파일이 사용되는지 확인했는데 'page.php'가 아닌 'page-courses.php'입니다 (기본 파일이라고 생각했습니다).
Gchtr

"코스"는 정적 페이지의 이름입니까?
칩 베넷

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()합니까? 코드 예제?
칩 베넷

@ ChipBennett, 나는 질문을 이해하지 못합니다. 특정 템플릿이있는 페이지에만 필터를 적용해야하는 경우을 호출하기 전에 템플릿에 동일한 코드를 배치 할 수 있습니다 get_header().
Mark Kaplun

예, 실제로도 이것이 효과가 있다고 생각합니다. 그러나 query_vars에서 사용할 수있는 플러그인에서 변수를 설정하려면 우회를해야한다고 생각합니까? 따라서 필터링 the_title은 더 나은 솔루션입니다.
Gchtr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.