nhận được $ bài đăng trong bộ lọc init hoặc hành động?


12

Có vẻ như $ post chỉ có sẵn để hook thực thi tại một số thời điểm nhất định. Tôi có một hook "init" cần lấy một số dữ liệu từ cơ sở dữ liệu bằng cách sử dụng $ post-> ID.

Cho đến nay, cách giải quyết duy nhất của tôi là thêm một bộ lọc khác trên the_content, sử dụng $ post để lấy thông tin tôi cần. Thật không may, nó cũng lặp lại giá trị trả về cho màn hình và không thực sự trả nó về chức năng được gọi là bộ lọc ban đầu.

Đây là đoạn mã trích xuất dữ liệu tôi cần, nhưng lặp lại và không trả về giá trị:

add_filter('the_content', 'get_keyword');
function get_keyword()
{
    global $post;
    $keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
    return $keyword;
}

Có ai có bất kỳ đề nghị nào về cách có được những gì tôi cần và đưa nó trở lại chức năng gọi điện để sử dụng sau này trong plugin không?

EDIT: Để có thể làm cho điều này rõ ràng hơn, tôi có một bộ lọc đang chạy ở init, cần phải có thể truy xuất thông tin trên bài đăng hiện tại từ DB. Để làm điều này, nó yêu cầu quyền truy cập vào $ post-> ID. Nhưng điều đó là không thể trong init, vậy làm thế nào tôi có thể nhận được kết quả tôi cần?

Cảm ơn,

Jonathan

GIẢI QUYẾT:

Hóa ra câu trả lời chỉ đơn giản là sử dụng url_to_postid như thế này:

$keyword = get_post_meta(
     url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
     '_wpg_def_keyword',
     true
);

Hoạt động hoàn hảo ngay cả từ init.


1
bạn cần một hook hành động và không phải hook hook, cũng initlà quá sớm global $post;để nằm trong phạm vi. có lẽ nếu bạn mô tả những gì bạn đang cố gắng thực hiện sẽ giúp tốt hơn.
Bai Internet

hook hành động hoạt động chính xác theo cùng một cách, tôi đã thử cả hai. Tôi biết init là quá sớm, tôi đang cố gắng tìm ra cách thực hiện kết quả tôi cần - đó là một bộ lọc chạy tại init nhận thông tin từ DB yêu cầu $ post-ID để truy xuất.
Jonathan

Bạn có thực sự cần phải làm điều này trên init? Tại sao không móc sau?
Rarst

Tôi phải truy xuất từ ​​khóa mặc định cho trang, nếu không có từ khóa nào được cung cấp trong URL. Từ khóa đó được lưu trữ trong DB và phải được biết trước khi bất kỳ phần còn lại nào của tập lệnh thực thi. Như bạn có thể thấy trong mẫu tôi đã cung cấp, tôi chỉ có thể nhận được giá trị tôi cần trong the_content, nhưng sau đó nó sẽ lặp lại màn hình và hoàn toàn không quay trở lại chức năng gọi. Nếu bạn có một giải pháp khác, xin vui lòng đề nghị nó.
Jonathan

Vui lòng chuyển giải pháp của bạn đến một câu trả lời, tha sẽ phù hợp hơn với cơ chế của trang web. Ngoài ra, không cần phải giải quyết trong tiêu đề - bạn sẽ có thể chấp nhận câu trả lời và câu hỏi của bạn sẽ được đánh dấu là đã trả lời.
Rarst

Câu trả lời:


12

Hóa ra câu trả lời chỉ đơn giản là sử dụng url_to_postidnhư thế này:

$keyword = get_post_meta( url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ), '_wpg_def_keyword', true );

Hoạt động hoàn hảo ngay cả từ init.


2

Điều này cũng hoạt động trong WordPress 4.7:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

2

Có vấn đề khi sử dụng câu trả lời được chấp nhận vì nó không hoạt động với các cổng và cổng nhiều trang . Đây là một giải pháp nên hoạt động trong mọi trường hợp:

/**
* Note: This function will only work on SINGULAR posts/pages/post types
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demo
add_action('init','my_super_early_meta_action');

function my_super_early_meta_action() {
    $keyword = get_post_meta( get_early_postid(), '_wpg_def_keyword', true );
}
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.