2012-03-04 31 views
6

Tôi đang viết một plugin WordPress đơn giản sử dụng shortcode. Tôi muốn trang chứa shortcode để có các thẻ <meta> cụ thể. Điều này có thể không? Và nếu vậy, có cách nào thanh lịch để làm điều đó không?Sử dụng mã ngắn WordPress để thêm <meta> thẻ

Tôi biết rằng tôi có thể thêm <meta> thẻ bằng móc wp_head, nhưng tôi muốn nội dung thẻ meta khớp với chuỗi được plugin tạo ra. Tôi có thể di chuyển tất cả các mã vào tiêu đề, nhưng sau đó tôi không chắc chắn làm thế nào để tham khảo nó sau này từ shortcode. Nói cách khác, khi tôi khai báo một biến trong <head> với một bộ lọc, nó không có sẵn cho các phương thức lớp mà tôi đang gọi bằng shortcode.

Bất kỳ ý tưởng nào?

UPDATE:

Một giải pháp tốt đẹp đã được đề xuất, trong đó hàm điều khiển cho shortcode thêm hành động để móc wp_head:

add_shortcode('fakeshortcode', 'fakeshortcode_handler'); 
function fakeshortcode_handler() { 

    function add_meta_tags() { 
     //echo stuff here that will go in the head 
    } 
    add_action('wp_head', 'add_meta_tags'); 
} 

Đây là sưng lên, nhưng vấn đề là wp_head điều đó xảy ra TRƯỚC shortcode được phân tích cú pháp và thêm hành động (vì vậy không có gì được thêm vào đầu bằng mã ở trên ALONE). Để làm cho nó hoạt động, tôi đã mượn giải pháp trong this post. Về cơ bản, nó là một chức năng "nhìn về phía trước" vào bài đăng và xem liệu có bất kỳ mã ngắn nào sắp tới hay không. Nếu có, thì IT sẽ thêm add_action('wp_head'....

EDIT: Tôi đã xóa câu hỏi tiếp theo về cách vượt qua biến. Đây là câu hỏi mới here.

Trả lời

11

nỗ lực đầu tiên (không sử dụng này ... thấy 'chỉnh sửa' dưới đây):

Trước tiên, bạn cần phải thiết lập shortcode của bạn với một cái gì đó như thế này:

add_shortcode('metashortcode', 'metashortcode_addshortcode'); 

Sau đó, , bạn sẽ tạo ra các chức năng mà bạn sẽ có thêm một cái móc để wp_head với một cái gì đó như thế:

function metashortcode_addshortcode() { 
    add_action('wp_head', 'metashortcode_setmeta'); 
} 

Sau đó, bạn sẽ xác định wha t bạn muốn làm trong wp_head:

function metashortcode_setmeta() { 
    echo '<meta name="key" content="value">'; 
} 

Thêm shortcode [metashortcode] nên thêm dữ liệu meta của bạn khi cần thiết. Mã này chỉ được cung cấp để giúp bạn hiểu cách làm cho nó xảy ra. Nó không được kiểm tra đầy đủ.

Chỉnh sửa: Mã trước đó chỉ là một khái niệm và không thể hoạt động do thứ tự thực hiện. Dưới đây là ví dụ hoạt động sẽ nhận được kết quả mong đợi:

// Function to hook to "the_posts" (just edit the two variables) 
function metashortcode_mycode($posts) { 
    $shortcode = 'metashortcode'; 
    $callback_function = 'metashortcode_setmeta'; 

    return metashortcode_shortcode_to_wphead($posts, $shortcode, $callback_function); 
} 

// To execute when shortcode is found 
function metashortcode_setmeta() { 
    echo '<meta name="key" content="value">'; 
} 

// look for shortcode in the content and apply expected behaviour (don't edit!) 
function metashortcode_shortcode_to_wphead($posts, $shortcode, $callback_function) { 
    if (empty($posts)) 
    return $posts; 

    $found = false; 
    foreach ($posts as $post) { 
    if (stripos($post->post_content, '[' . $shortcode) !== false) { 
     add_shortcode($shortcode, '__return_empty_string'); 
     $found = true; 
     break; 
    } 
    } 

    if ($found) 
    add_action('wp_head', $callback_function); 

    return $posts; 
} 

// Instead of creating a shortcode, hook to the_posts 
add_action('the_posts', 'metashortcode_mycode'); 

Tận hưởng!

+0

Thật tuyệt. Tôi đã không nhận ra rằng shortcode đã được phân tích cú pháp TRƯỚC KHI các hành động wp_head đã xảy ra. Tôi sẽ thử cái này ngay lập tức. Nếu bạn đúng, tôi chắc chắn nó sẽ giải quyết vấn đề của tôi một cách độc đáo! – emersonthis

+0

Nghi ngờ của tôi là chính xác. Hành động wp_head được kích hoạt TRƯỚC KHI mã ngắn được phân tích cú pháp. Vì vậy, giải pháp này không hoạt động chính xác như được mô tả. BAO GIỜ, cách tiếp cận có thể được sửa đổi ... [xem cập nhật của tôi ở trên] – emersonthis

+0

Xin lỗi Emerson, tôi hiểu lầm những gì bạn đang cố gắng làm.Nó KHÔNG được thực thi trước đó. Do đó, tôi đã chỉnh sửa giải pháp của mình để làm cho nó hoạt động đúng cách. – Maxime

Các vấn đề liên quan