Các vấn đề với thẻ tiêu đề và document_title_parts


12

Wordpress version 4.5.1

Tôi đang cố gắng tự động cập nhật tiêu đề trang trên một mẫu cụ thể. Sau khi đào và tìm hiểu về các wp_title()thay đổi, tôi đang cố gắng sử dụng document_title_parts. Tuy nhiên, tôi không thể có được bộ lọc để chạy.

Tôi đang ở trong một chủ đề trẻ em , 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 );

Tôi đã thử cả hai biến thể của việc thêm hỗ trợ chủ đề như được hiển thị ở trên, nhưng xem nhật ký của tôi, không có gì xuất hiện trên trang tải lại. Đó error_loglà làm việc với các chức năng khác (chẳng hạn như wp_title), vì vậy việc ghi nhật ký lỗi đang hoạt động.

Tôi cũng đã thử pre_get_document_title, nó kích hoạt tải trang, mặc dù tôi không thể làm cho nó thực sự thay đổi tiêu đề.

Vì thế! Tôi đang sử dụng bộ lọc sai, không thiết lập chính xác chủ đề của mình hoặc điều gì khác mà tôi không biết. Mọi sự trợ giúp sẽ rất được trân trọng!

chỉnh sửa để thêm chi tiết

Đang thử một hàm init, nhưng nó cũng không hoạt động: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Ngoài ra, trong khi tôi đã xóa bất kỳ tham chiếu nào <title>từ header.php, tiêu đề trang web thực tế vẫn hiển thị trong nguồn.


Tại sao bạn nhận xét ra dòng này //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? Đó là sử dụng chính xác của việc thêm hỗ trợ chủ đề.
Sumit

@Sumit Tôi đã thử cả phiên bản nhận xét và phiên bản hoạt động.
hookedonwinter

Có thể thử thêm add_theme_support()chức năng trong một hook hook . Một điều nữa là đảm bảo rằng bạn ghi đè lên header.phptệp của mình để không<title>thẻ html .
Howdy_McGee

@Howdy_McGee Chỉ cần thử mà vẫn không có gì. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter

@hookedonwinter Và bạn có chắc chắn rằng không có <title>thẻ nào trong bạn header.phpkhông? Có thể thử thay thế 10bằng PHP_MAX_INT. Ngoài ra, tham số đã truyền là một mảng thay vì giá trị chuỗi.
Howdy_McGee

Câu trả lời:


13

Tôi đã chạy bộ lọc của bạn trong khu vực phát triển của tôi. Nó không hoạt động. Sau đó, tôi tắt plugin Yoast SEO, cái mà tôi biết cũng đang làm rối tung tiêu đề trang. Sau đó, nó làm việc. Vì vậy, đề nghị của tôi sẽ là một plugin khác đang gây rối với nó.

Trong trường hợp của Yoast, đó là một cuộc gọi bộ lọc để pre_get_document_titletrả về không trống. Trong trường hợp đó wp_get_document_titleđược ngắn mạch và phần còn lại của hàm, bao gồm documents_title_partsbộ lọc, không được đánh giá, như bạn có thể thấy từ các dòng mã đầu tiên:

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

Vì vậy, tôi lấy bộ lọc của bạn và thay đổi hook thành pre_get_document_title. Nó không hoạt động. Sau đó, tôi đã thay đổi mức độ ưu tiên thành mức cao hơn so với bộ lọc tương tự trong Yoast. Sau đó, nó làm việc. Vì vậy, tôi không biết về thiết lập của bạn, nhưng tôi khuyên bạn nên dùng thử:

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

1
Bạn hiểu rồi Tôi đã tìm thấy điều tương tự, và vô hiệu hóa Yoast. Tôi chỉ kích hoạt lại và sử dụng ưu tiên của bạn và nó đã hoạt động. CẢM ƠN BẠN!
hookedonwinter

Thêm một chút về móc ở đây: wordpress.stackexchange.com/questions/109869/
triệt

Từ trang web của tôi, pre_get_document_titleưu tiên 15 là đủ.
vee

6

Sau một số thử nghiệm, tôi đã đưa ra gợi ý sau: có thể là <title>thẻ đó được "mã hóa cứng" trong chủ đề gốc của bạn header.phpkhông? Nếu đó là trường hợp, bạn có thể cố gắng xóa <title>thẻ khỏi chủ đề con của bạn header.php(sao chép header.phpthư mục của cha mẹ bạn vào thư mục chủ đề con của bạn) và sau đó thêm hỗ trợ chủ đề qua lại functions.php:

add_theme_support( 'title-tag' );

Tôi sẽ cố gắng giải thích điều gì dẫn tôi đến đề xuất này: Tôi đã thử khi bạn và những người khác đề xuất - nhưng hóa ra tôi đã tìm thấy hai <title>thẻ trong mã nguồn. Cái đầu tiên có tiêu đề tiêu chuẩn , cái thứ hai có tiêu đề sửa đổi . Nhưng (tất nhiên) trong thanh tiêu đề trình duyệt tôi chỉ có thể thấy tiêu đề mặc định.

Sau đó, tôi đã kiểm tra header.phpchủ đề gốc mà tôi đã sử dụng (hai mươi trang) và <title>thẻ thực sự được mã hóa cứng trong mẫu đó như thế này:

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

Sau khi tôi xóa nó, tôi đã thêm đoạn mã sau vào chủ đề con functions.phpvà nó đã hoạt động:

/**
 * 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 );

Vì vậy, về cơ bản nó cũng hoạt động trước khi xóa <title>thẻ khỏi mẫu - chỉ có hai <title> thẻ sau đó bị bỏ qua. Đây có thể là cùng một vấn đề với chủ đề của bạn?

Vì wp 4.4.0 tuy nhiên <title>thẻ được tạo động bởi hàm _wp_render_title_tag(), về cơ bản gọi hàm khác wp_get_document_title()và bao bọc các thẻ html xung quanh kết quả. Câu chuyện dài: nếu chủ đề của bạn header.phpthiếu <title>thẻ, rất có thể bạn có thể ghi đè tiêu đề trực tiếp thông qua pre_get_document_titlehoặc document_title_partsnhư được mô tả ở đây :

1) thay đổi tiêu đề trực tiếp:

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

2) lọc các phần tiêu đề:

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

3

Sau khi đọc bài đăng của bạn từ đầu đến botom và từ dưới lên trên, bạn hoàn toàn có thể có một bộ lọc chuyển tiêu đề qua pre_get_document_titlebộ lọc. Manh mối ở đây tuyên bố sau:

Tôi cũng đã thử pre_get_document_title, không kích hoạt tải trang,

Nhìn vào mã soure chowp_get_document_title() , chúng ta thấy mã sau:

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

Điều này có nghĩa là, bất cứ khi nào một giá trị không trống được chuyển qua pre_get_document_titlebộ lọc, wp_get_document_title()hàm sẽ trả về bất kỳ giá trị nào được truyền qua pre_get_document_titlebộ lọc. Trong trường hợp này, document_title_separatorbộ lọc và document_title_partsbộ lọc sẽ không bao giờ được thực thi vì chúng chỉ chạy sau pre_get_document_titlebộ lọc.

Nhìn vào những gì bạn nói thêm một chút về:

... mặc dù tôi không thể làm cho nó thực sự thay đổi tiêu đề.

bạn chắc chắn có một pre_get_document_titlebộ lọc có thẩm quyền ghi đè lên thể hiện của cùng một bộ lọc và do bộ lọc này, hàm trả về bất cứ thứ gì được truyền cho nó, dẫn đến document_title_partsbộ lọc của bạn không được thực thi.

Những gì bạn sẽ cần làm là sử dụng một grephoặc một trình soạn thảo tốt và tìm kiếm toàn bộ wp-contentthư mục của bạn cho pre_get_document_titlebộ lọc đó . Khi bạn định vị bộ lọc đó, bạn có thể lấy nó từ đó để xóa bộ lọc đó và thay thế bộ lọc đó bằng bộ lọc của riêng bạn


Cảm ơn câu trả lời! Thật không may, tìm kiếm tất cả nội dung wp cho document_title_partshoặc pre_get_document_titletrả về 0 kết quả. Tôi đang sử dụng SublimeText 2 để tìm kiếm tất cả nội dung wp ...
hookedonwinter

Điều này thực sự đánh bại tôi. Điều thực sự kỳ lạ là một bộ lọc trong một chức năng sẽ kích hoạt chính xác và bộ lọc sau đó thì không. Hãy thử xóa tất cả bộ nhớ cache và khôi phục WordPress nếu bạn chắc chắn đó không phải là plugin hoặc chủ đề của bạn. Điều gì xảy ra trên một cài đặt vanilla với một chủ đề đi kèm, điều gì xảy ra nếu bạn trực tiếp thay đổi chủ đề gốc. Thật không may, theo như tôi có thể giúp với thông tin được cung cấp. Nếu bạn có bất kỳ thông tin bổ sung nào, hãy gửi một bản chỉnh sửa để chúng tôi có thể hỗ trợ bạn giải quyết vấn đề này
Pieter Goosen

@PieterGoosen Khi bộ lọc đầu tiên trả về không trống, chức năng bị ngắn mạch và bộ lọc thứ hai không được đánh giá.
cjbj

@cjbj vâng, đúng rồi, đó là những gì tôi đã nói trong câu trả lời của tôi, vấn đề là gì. Như OP đã nói, anh ta không thể tìm thấy bộ lọc trên pre_get_document_title, điều gì sẽ giải thích hoàn toàn tại sao bộ lọc thứ hai không kích hoạt. Điều này làm cho pre_get_document_titlebộ lọc trống, có nghĩa là hai bộ lọc khác trong chức năng phải kích hoạt, nhưng chúng không hoạt động. Nó để tôi kết luận một lõi Wordpress bị hỏng.
Pieter Goosen

Ngoại trừ việc tôi có bộ lọc đó để làm việc dễ dàng.
cjbj

2

Nếu chủ đề gốc không khai báo hỗ trợ cho title-tagbạn, bạn có thể làm như thế này trong chủ đề con

/**
 * 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 );

Bộ lọc document_title_parts mảng loại trả về dự kiến, như thế này, đảm bảo thay đổi điều kiện if theo yêu cầu của bạn hoặc xóa hoàn toàn để thay đổi tiêu đề trên toàn trang chỉ để thử nghiệm nếu nó hoạt động.

/**
 * 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' );

Bạn có thể thử hai chức năng này không?


Cảm ơn câu trả lời. Tôi đã thử nó, loại bỏ câu lệnh if để làm cho nó rộng hơn và tôi đã thêm một số ghi nhật ký lỗi để xem những gì đang xảy ra. Đây là mã. . Chỉ add_theme_support_childđược ghi lại.
hookedonwinter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.