title-tag 및 document_title_parts 관련 문제


12

Wordpress version 4.5.1

특정 템플릿에서 페이지 제목을 동적으로 업데이트하려고합니다. wp_title()변경 사항 에 대해 많은 것을 파고 배우고 나서을 사용하려고합니다 document_title_parts. 그러나 필터를 전혀 실행할 수 없습니다.

나는 어린이 테마에 있습니다 functions.php.

add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });

add_filter( 'document_title_parts', function( $title )
{
    error_log('here');
    return $title;

}, 10, 1 );

위와 같이 테마 지원을 추가하는 두 가지 변형을 시도했지만 내 로그를 보면 페이지를 다시로드 할 때 아무것도 나타나지 않습니다. 즉, error_log다른 기능 (예를 들면 작업 된 wp_title오류 로깅이 작동되도록).

나는 또한 pre_get_document_title제목을 실제로 바꿀 수는 없지만 페이지로드시 실행되는 을 시도 했습니다.

그래서! 필터를 잘못 사용 중이거나 테마를 올바르게 설정하지 않았거나 알지 못하는 다른 항목이 있습니다. 어떤 도움이라도 대단히 감사하겠습니다!

더 자세한 내용을 추가하려면 수정

초기화 기능을 시도했지만 작동하지 않습니다 : https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

나는에 대한 참조를 제거 한 동안 또한, <title>에서를 header.php실제 사이트 제목은 여전히 소스에 표시됩니다.


왜이 줄을 주석 처리 했 //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });습니까? 테마 지원 추가의 올바른 사용입니다.
수밋

@ Sumit 나는 주석 처리 된 버전과 활성 버전을 모두 시도했습니다.
hookedonwinter

아마도 init hook에add_theme_support() 함수를 추가해보십시오 . 또 다른 방법은 html 태그 가 없도록 파일을 덮어 쓰는 것 입니다. header.php<title>
Howdy_McGee

@Howdy_McGee 그냥 시도했지만 여전히 아무것도 없습니다. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter

@hookedonwinter 그리고 당신은에 <title>태그 가 없다고 확신 header.php합니까? 어쩌면 교체 시도 10와 함께 PHP_MAX_INT. 또한 전달 된 매개 변수는 문자열 값 대신 배열입니다.
Howdy_McGee

답변:


13

개발 영역에서 필터를 실행했습니다. 작동하지 않았다. 그런 다음 Yoast SEO 플러그인을 해제했는데 페이지 제목도 엉망이었습니다. 그런 다음 효과가있었습니다. 그래서 내 제안은 다른 플러그인이 엉망이 될 것입니다.

Yoast의 경우 pre_get_document_title비어 있지 않은 것을 반환 하는 필터 호출이었습니다 . 이 경우 wp_get_document_title단락 documents_title_parts이 발생하고 첫 번째 코드 줄에서 볼 수 있듯이 필터를 포함한 나머지 기능 은 평가되지 않습니다.

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
    }

그래서 필터를 가져 와서 후크를로 변경했습니다 pre_get_document_title. 작동하지 않았다. 그런 다음 Yoast의 동일한 필터보다 우선 순위를 높은 수준으로 변경했습니다. 그런 다음 효과가있었습니다. 따라서 설정에 대해 잘 모르지만 시도해보십시오.

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );

1
맞아요! 같은 것을 발견하고 Yoast를 비활성화했습니다. 방금 재 활성화하고 귀하의 우선 순위를 사용했으며 효과가있었습니다. 감사합니다!
hookedonwinter

여기에 후크에 대한 자세한 내용 : wordpress.stackexchange.com/questions/109869/…
cjbj

내 사이트에서 pre_get_document_title우선 순위 15 로 충분합니다.
vee

7

일부는 나는 다음과 같은 제안에 온 실험 후 : 그것은 것이 될 수 <title>태그는 부모 테마의 내부에 "하드 코딩"입니다 header.php? 이 경우 <title>자식 테마에서 태그 를 제거하고 header.php(부모 header.php를 자식 테마 폴더에 복사) 다음을 통해 테마 지원을 다시 추가 할 수 있습니다 functions.php.

add_theme_support( 'title-tag' );

이 제안을 이끌어내는 이유를 설명하려고 노력할 것입니다. 여러분과 다른 사람들이 제안한대로 시도했지만 소스 코드에서 두 개의 <title>태그 를 찾았습니다 . 첫 번째 제목표준 제목 이고 두 번째 제목수정 된 제목 입니다. 그러나 (물론) 브라우저 제목 표시 줄에서 기본 제목 만 볼 수있었습니다.

그런 다음 header.php내가 사용한 부모 테마 (24 개)를 확인했으며 <title>태그는 실제로 해당 템플릿 내부에 다음과 같이 하드 코딩되었습니다.

<title><?php wp_title( '|', true, 'right' ); ?></title>

그것을 제거한 후에 다음 테마를 자식 테마에 추가하고 functions.php작동했습니다.

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {

    // change title parts here
    $title['title'] = 'My Title'; 
    $title['tagline'] = 'My fancy tagline'; // optional
    $title['site'] = 'example.org'; //optional

// }

return $title; 

}

add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );

따라서 기본적으로 <title>템플릿 에서 태그를 제거하기 전에 작동했습니다. <title> 태그 만 있으면 나중에 무시되었습니다. 이것이 주제와 같은 문제 일 수 있습니까?

그러나 wp 4.4.0부터 <title>태그는_wp_render_title_tag() 기본적으로 다른 함수를 호출 wp_get_document_title()하고 결과를 html 태그로 감싸는 함수에 의해 동적으로 생성 됩니다 . 간단히 말해 : 테마 header.php<title>태그 가없는 경우 직접 pre_get_document_title또는 여기에document_title_parts 설명 된대로 제목을 재정의 할 수 있습니다 .

1) 제목을 직접 변경하십시오.

add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
    return 'The expected title';
}

2) 제목 부분을 필터링 :

add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
    return array('a', 'b', 'c');
}

3

게시물을 위에서 아래로, 아래에서 위로 읽으면 모든 확률에서 필터를 통해 제목을 전달하는 pre_get_document_title필터가 있습니다. 여기에 단서가 있습니다 :

또한 pre_get_document_title페이지로드시 실행되는,

에 대한 소스 코드를wp_get_document_title() 보면 다음 코드가 표시됩니다.

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

이것은 비어 있지 않은 값이 pre_get_document_title필터를 통과 할 때마다 필터 를 통해 wp_get_document_title()전달 된 값을 반환합니다 pre_get_document_title. 이 경우 document_title_separator필터와 document_title_parts필터는 pre_get_document_title필터 후에 만 실행되므로 절대 실행되지 않습니다 .

당신이 조금 더 말한 것을 살펴보십시오.

... 실제로 제목을 변경할 수는 없습니다.

pre_get_document_title동일한 필터의 인스턴스를 재정의하는 권한을 가진 필터가 있어야합니다. 이 필터로 인해 함수는 전달 된 모든 것을 반환하므로 document_title_parts필터가 실행되지 않습니다.

당신이해야 할 일은 하나 grep또는 좋은 편집기 를 사용 wp-content하고 해당 pre_get_document_title필터에 대한 전체 폴더를 검색하는 것 입니다. 해당 필터를 찾으면 필터를 제거하고 자신의 필터로 교체 할 수 있습니다.


답변 해주셔서 감사합니다! 불행하게도, 대한 WP-모든 콘텐츠를 검색 document_title_parts또는 pre_get_document_title0 결과 돌아갑니다. SublimeText 2를 사용하여 모든 wp-content를 검색하고 있습니다.
hookedonwinter

이것은 정말로 나를 때린다. 함수에서 하나의 필터가 올바르게 실행되고 그 후에 필터가 작동하지 않는 것은 정말 이상합니다. 플러그인이나 테마가 아닌 경우 모든 캐시를 지우고 WordPress를 다시 설치하십시오. 번들 테마로 바닐라 설치에서 발생하는 상황, 상위 테마를 직접 변경하면 어떻게됩니까? 불행히도 주어진 정보로 도움을 줄 수 있습니다. 추가 정보가있는 경우 수정 을 신청하여 문제 해결에 도움을 줄 수 있습니다.
Pieter Goosen

@PieterGoosen 첫 번째 필터가 비어 있지 않으면 함수는 단락되고 두 번째 필터는 평가되지 않습니다.
cjbj

@ cjbj 예, 맞습니다. 제 대답에서 말한 것이 문제입니다. OP가 말했듯이에서 필터를 찾을 수 없습니다. pre_get_document_title왜 두 번째 필터가 작동하지 않는지 완전히 설명했습니다. 이렇게하면 pre_get_document_title필터가 비워집니다. 즉, 함수의 다른 두 필터는 실행해야하지만 그렇지 않습니다. 부패한 Wordpress 핵심을 결론 내릴 수 있습니다.
피터 구센

그 필터가 쉽게 작동한다는 것을 제외하고는.
cjbj

2

부모 테마가 지원을 선언하지 않으면 title-tag자식 테마에서 이와 같이 할 수 있습니다.

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );

document_title_parts이와 같이 예상되는 반환 유형 배열을 필터링 하면 요구 사항에 따라 if 조건을 변경하거나 작동 여부를 테스트하기 위해 사이트 전체에서 제목을 변경하려면 완전히 제거하십시오.

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title['title'] - Page Title
 * $title['tagline'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is 'template-homepage.php'
    if ( is_page_template( 'template-homepage.php' ) ) {
        $title['title'] = 'Changed title for a template';
    }

    return $title;

}

add_filter( 'document_title_parts', 'change_title_for_a_template' );

두 가지 기능을 시도해 볼 수 있습니까?


답변 해주셔서 감사합니다. 나는 그것을 더 넓게 만들기 위해 if 문을 제거하고 그것을 시도했고, 무슨 일이 일어나고 있는지 확인하기 위해 오류 로깅을 추가했습니다. 코드는 다음과 같습니다. . 만 add_theme_support_child기록됩니다.
hookedonwinter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.