Thay đổi động__tiêu () của trang


9

Tôi đang phát triển một plugin không sử dụng loại bài đăng tùy chỉnh, nhưng các bảng cơ sở dữ liệu riêng biệt. Đây là một plugin hiển thị danh sách các khóa học với các liên kết dẫn đến các trang chi tiết khóa học khác nhau, nơi người dùng sau đó có thể đăng ký một khóa học.

Ở trạng thái hiện tại, tôi đang sử dụng một mã ngắn để đưa dữ liệu bổ trợ vào một trang có mẫu trang tùy chỉnh (page-khóa.php).

Bây giờ tôi muốn thay đổi linh hoạt the_title(), theo trang mà plugin hiển thị (danh sách các khóa học, trang chi tiết khóa học với các biểu mẫu, trang gửi biểu mẫu thành công). Nhưng bất cứ khi nào tôi làm điều đó với bộ lọc sau, các liên kết đến các trang khác trong phần chân trang cũng thay đổi:

<?php

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

Biên tập

Trong phần chân trang.php tôi có một hàm bao gồm các liên kết chân trang wp_nav_menu()để tôi có thể định nghĩa chúng trong Giao diện> Menu. Nhưng với bộ lọc ở trên, tất cả các liên kết trong phần chân trang cũng thay đổi thành Title Tiêu đề tùy chỉnh '. Nhưng tôi chỉ muốn thay đổi tiêu đề của trang, không ảnh hưởng đến các liên kết menu trong phần chân trang.

Cố gắng thêm thẻ có điều kiện, in_the_loop()các liên kết chân trang vẫn bị ảnh hưởng, mặc dù chúng không nằm trong vòng lặp.

<?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';
}

Nó tương tự như câu hỏi này: lọc vấn đề về tiêu đề trong điều hướng , chỉ là các liên kết bị ảnh hưởng nằm ở chân trang và in_the_loop()không hoạt động.

Làm cách nào tôi có thể thay đổi the_title()trong khi chỉ ảnh hưởng đến tiêu đề của trang hiện tại được hiển thị không ảnh hưởng đến các liên kết trong chân trang ?

Chỉnh sửa 2 - Giải pháp

Vì vậy, cuối cùng tôi đã làm cho nó hoạt động:

<?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;
}

Trang tệp-listcifts.php là Mẫu bài đăng tùy chỉnh mà tôi đã gán cho trang tĩnh có tên 'Khóa học'.

Tôi cho rằng nó không hoạt động trước đây vì tên của trang tĩnh và tên tệp của Mẫu bài tùy chỉnh giống nhau.


1
Tại sao bạn lăn các bảng cơ sở dữ liệu của riêng bạn? Cuộc sống của bạn sẽ đơn giản hơn nhiều nếu bạn triển khai nội dung tùy chỉnh của mình dưới dạng Loại bài đăng tùy chỉnh .
Chip Bennett

Tôi thực sự nghĩ rằng câu hỏi này sẽ đến. Tôi phát triển plugin này để tìm hiểu Wordpress, vì vậy trước tiên tôi không biết về Loại bài đăng tùy chỉnh. Tôi có hai bảng cơ sở dữ liệu, một cho các khóa học và một cho các loại khóa học. Một danh mục có thể có một vài khóa học, vì vậy hai bảng được liên kết. Tôi không nghĩ rằng thật dễ dàng để thực hiện nó với Loại bài tùy chỉnh. Chắc chắn tôi có thể sử dụng Phân loại tùy chỉnh cho các khóa học, nhưng tôi sẽ phải thêm nhiều lĩnh vực hơn, vì danh mục khóa học không chỉ có tên. Bây giờ, làm điều đó dễ dàng hơn nhiều với các bảng cơ sở dữ liệu tùy chỉnh.
Gchtr

1
Trường hợp sử dụng của bạn là trường hợp sử dụng chính xác, dành cho Loại bài đăng tùy chỉnh và Phân loại tùy chỉnh. Bạn có thể đang đánh giá sai sự thanh lịch, linh hoạt và sức mạnh của CPT và các nguyên tắc phân loại tùy chỉnh.
Chip Bennett

Tôi thực sự có thể làm được. Tôi có lẽ chỉ nên thử. Cảm ơn vì lời khuyên.
Gchtr

in_the_loop()được đặt thành truebất cứ khi nào the_post()bị sa thải. Không đào sâu vào cốt lõi và biết rằng các menu điều hướng là các vòng lặp , tôi đoán rằng ở đâu đó trên đường đi, wp_nav_menu()tạo ra một vòng lặp, gây ra in_the_loop()trở lại true.
Chip Bennett

Câu trả lời:


5

Tôi sẽ sử dụng is_page_template()điều kiện:

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

Biên tập

Bạn sẽ sử dụng điều kiện này trong cuộc gọi lại bộ lọc của bạn:

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

Bây giờ, để chỉ cách ly tiêu đề của các trang sử dụng mẫu trang của bạn, bạn có thể tận dụng tham số khác được truyền tới the_title: $id. Vì bạn biết Id của bài đăng mà tiêu đề đang được lọc, bạn có thể truy vấn _wp_page_templatemeta bài đăng và đảm bảo rằng nó bằng với mẫu trang của bạn:

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

Chỉnh sửa 2

Nếu bạn muốn nhắm mục tiêu cụ thể trang "Khóa học", hãy sử dụng is_page()với sên trang 'courses'hoặc tiêu đề trang của 'Courses':

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

Mặc dù vậy, tôi khuyên bạn nên thay đổi page-courses.phpthành Mẫu trang tùy chỉnh , điều này sẽ làm cho toàn bộ quá trình này mạnh mẽ hơn nhiều.


Điều đó đã không làm việc cho bây giờ. Nhưng tôi đã tinh chỉnh câu hỏi của mình, vì nó có thể không đủ cụ thể. Có lẽ vấn đề nằm ở một nơi khác.
Gchtr

Bạn có ý nghĩa gì bởi " điều đó không làm việc bây giờ "? Có gì chính xác bạn đã thử? Bạn đã mong đợi điều gì xảy ra, điều đó đã không xảy ra, hoặc điều gì đã xảy ra bất ngờ?
Chip Bennett

Xem câu trả lời cập nhật, nên giải quyết các tiêu đề mục menu điều hướng.
Chip Bennett

Tôi nói rằng bởi vì tôi nghĩ câu trả lời của bạn có thể là câu trả lời đúng (đẩy đúng hướng), nhưng tôi có thể không hỏi câu hỏi của mình đủ rõ ràng. get_post_meta( $id, '_wp_page_template', true )trả lại defaultvà tôi không biết phải làm gì với điều này. Khi tôi đặt 'page-khóa.php' thành 'mặc định', tất cả các liên kết điều hướng sẽ thay đổi, ngoại trừ khi tôi nối the_titlebộ lọc vào loop_start, thì chỉ các liên kết chân trang thay đổi. Tôi đã kiểm tra tệp mẫu nào được sử dụng và đó là 'page-khóa.php' chứ không phải 'page.php' (mà tôi nghĩ có thể là tệp mặc định).
Gchtr

Vậy, "Khóa học" có phải là tên của trang tĩnh của bạn không?
Chip Bennett

1

Nếu bạn chỉ muốn chỉnh sửa tiêu đề trang hiện tại, hãy sử dụng in_the_loop()điều kiện, như trong:

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

Mặc dù is_page_template()sẽ hoạt động, tôi thích đặt loại mã này vào mẫu trang để có tất cả mã tạo ra loại trang này trong một tệp.


1
Làm thế nào điều đó sẽ làm việc, theo giả định rằng mã trong câu hỏi sử dụng the_title()? Mã ví dụ?
Chip Bennett

@ChipBennett, tôi không hiểu câu hỏi. Nếu anh ta cần bộ lọc chỉ được áp dụng cho trang có một mẫu cụ thể thì anh ta có thể đặt cùng một mã trong mẫu trước khi gọi get_header().
Đánh dấu Kaplun

Vâng, thực sự tôi cũng nghĩ rằng điều này sẽ làm việc. Tuy nhiên, tôi nghĩ rằng tôi sẽ phải đi đường vòng để đặt một biến trong plugin có sẵn trong query_vars? Vì vậy, đối với tôi, lọc the_titlelà một giải pháp đẹp hơn.
Gchtr
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.