source

최종 html 출력을 수정하는 WordPress 필터

factcode 2023. 3. 25. 11:56
반응형

최종 html 출력을 수정하는 WordPress 필터

WordPress는 출력 전에 모든 종류의 특정 콘텐츠를 가져오고 수정할 수 있는 우수한 필터를 지원합니다.맘에 들다the_content필터: 투고가 화면에 출력되기 전에 투고의 마크업에 액세스 할 수 있습니다.

출력하기 전에 최종 마크업 전체를 수정할 수 있는 마지막 기회를 주는 캐치올 필터를 찾고 있습니다.

필터 목록을 여러 번 살펴봤지만, https://codex.wordpress.org/Plugin_API/Filter_Reference에는 아무것도 표시되지 않습니다.

아는 사람?

워드프레스에는 최종 출력 필터가 없지만 함께 해킹할 수 있습니다.다음 예제는 프로젝트에 대해 만든 "Must Use" 플러그인에 있습니다.

주의: "셧다운" 액션을 사용할 수 있는 플러그인은 테스트하지 않았습니다.

플러그인은 열려 있는 모든 버퍼 레벨을 반복하여 닫고 출력을 캡처하는 방식으로 작동합니다.그런 다음 final_output 필터를 실행하여 필터링된 내용을 에코합니다.

안타깝게도 WordPress는 거의 동일한 프로세스(오픈 버퍼 닫기)를 수행하지만 실제로는 필터링을 위해 버퍼를 캡처하지 않기 때문에(플래시만 하면), 추가 "셧다운" 작업은 버퍼에 액세스할 수 없습니다.따라서 WordPress보다 아래 액션이 우선됩니다.

wp-content/mu-plugins/mu-plugins.php

<?php

/**
 * Output Buffering
 *
 * Buffers the entire WP process, capturing the final output for manipulation.
 */

ob_start();

add_action('shutdown', function() {
    $final = '';

    // We'll need to get the number of ob levels we're in, so that we can iterate over each, collecting
    // that buffer's output into the final output.
    $levels = ob_get_level();

    for ($i = 0; $i < $levels; $i++) {
        $final .= ob_get_clean();
    }

    // Apply any filters to the final output
    echo apply_filters('final_output', $final);
}, 0);

final_output 필터에 후크하는 예:

<?php

add_filter('final_output', function($output) {
    return str_replace('foo', 'bar', $output);
});

편집:

이 코드는 PHP 5.3 이상에서만 지원되는 익명 함수를 사용합니다.만약 당신이 PHP 5.2 이전 버전을 사용하는 웹사이트를 운영하고 있다면, 당신은 스스로를 해치고 있는 것입니다.PHP 5.2는 2006년에 출시되었으며, WP 버전 < 5.2에서는 Wordpress(편집:)가 여전히 지원되더라도 사용해서는 안 됩니다.

오래된 질문이지만 더 나은 방법을 찾았습니다.

function callback($buffer) {
  // modify buffer here, and then return the updated code
  return $buffer;
}

function buffer_start() { ob_start("callback"); }

function buffer_end() { ob_end_flush(); }

add_action('wp_head', 'buffer_start');
add_action('wp_footer', 'buffer_end');

설명 이 플러그인 코드는 다음 두 가지 액션을 등록합니다.buffer_start ★★★★★★★★★★★★★★★★★」buffer_end.

buffer_starthtml 을 참조해 주세요.''는callback출력 버퍼링의 마지막에 호출됩니다.두된 액션인 '두 번째 액션'이 발생할 때 합니다.두 번째 등록된 액션은buffer_end가 실행됩니다.

callback은 출력 값을입니다(함수).$buffer그런 다음 수정된 코드를 반환하기만 하면 페이지가 표시됩니다.

참고: 다음 항목에 고유한 함수 이름을 사용해야 합니다.buffer_start,buffer_end , , , , 입니다.callback따라서 플러그인의 다른 기능과 경합하지 않습니다.

AFAIK, 이 테마는 WordPress에서 처리되지 않는HTML을 사용하기 때문에 후크는 없습니다.

단, 출력 버퍼링을 사용하여 최종 HTML을 캡처할 수 있습니다.

<?php
// example from php.net
function callback($buffer) {
  // replace all the apples with oranges
  return (str_replace("apples", "oranges", $buffer));
}
ob_start("callback");
?>
<html><body>
<p>It's like comparing apples to oranges.</p>
</body></html>
<?php ob_end_flush(); ?>
/* output:
   <html><body>
   <p>It's like comparing oranges to oranges.</p>
   </body></html>
*/

@jacer, 다음 훅을 사용할 경우 헤더를 사용합니다.php도 포함되어 있습니다.

function callback($buffer) {      
    $buffer = str_replace('replacing','width',$buffer);
    return $buffer; 
}

function buffer_start() { ob_start("callback"); } 
function buffer_end() { ob_end_flush(); }

add_action('after_setup_theme', 'buffer_start');
add_action('shutdown', 'buffer_end');

저는 한동안 이 게시물의 상위 솔루션을 사용하고 있었습니다.「」를 합니다.mu-plugin이치노

, 이 됩니다.wp-super-cache 시 .mu-plugin.

래래를 : 를 so so so so so so so so so so so so wp-super-cache는 다음과할 수

add_filter('wp_cache_ob_callback_filter', function($buffer) {
    $buffer = str_replace('foo', 'bar', $buffer);
    return $buffer;
});

https://stackoverflow.com/users/419673/kfriend의 답변이 변경되었습니다.

모든 코드는 functions.php에 있습니다."final_output" 필터의 html을 사용하여 원하는 작업을 수행할 수 있습니다.

'함수'에 대해서요php'

//we use 'init' action to use ob_start()
add_action( 'init', 'process_post' );

function process_post() {
     ob_start();
}


add_action('shutdown', function() {
    $final = '';

    // We'll need to get the number of ob levels we're in, so that we can iterate over each, collecting
    // that buffer's output into the final output.
    $levels = ob_get_level();

    for ($i = 0; $i < $levels; $i++) {
        $final .= ob_get_clean();
    }

    // Apply any filters to the final output
    echo apply_filters('final_output', $final);
}, 0);

add_filter('final_output', function($output) {
    //this is where changes should be made
    return str_replace('foo', 'bar', $output); 
});

wp-includes/formating을 검색해 보십시오.php 파일.예를 들어 wpautop 함수입니다.페이지 전체를 조작하고 싶은 경우는, Super Cache 플러그 인을 참조해 주세요.그러면 캐싱을 위해 최종 웹 페이지가 파일에 기록됩니다.플러그인이 어떻게 작동하는지 보면 몇 가지 아이디어를 얻을 수 있을 것입니다.

실제로 최근 WP-Hackers 메일링 리스트에서 풀 페이지 수정에 대한 논의가 있었고, ob_start() 등을 사용한 출력 버퍼링이 유일한 실제 솔루션이라는 데 의견이 모아진 것 같습니다.http://groups.google.com/group/wp-hackers/browse_thread/thread/e1a6f4b29169209a#의 장점과 단점에 대한 논의도 있었습니다.

요약:이것은 (WP-Supercache 플러그인에서처럼) 필요할 때 가장 적합한 솔루션이지만, 컨텐츠가 브라우저로 전송되도록 허용되지 않기 때문에 전반적인 속도가 느려집니다. 대신 완전한 문서가 렌더링될 때까지 기다려야 합니다(ob_end()).

.functions.php:

ob_start();
add_action('shutdown', function () {
    $html = ob_get_clean();
    // ... modify $html here
    echo $html;
}, 0);

저는 여기서 한동안 답을 테스트해 왔습니다.캐시 브레이크 문제는 여전히 문제가 되고 있기 때문에 조금 다른 해결책을 생각해 냈습니다.테스트에서는 페이지 캐시가 파손되지 않았습니다.이 솔루션은 내 WordPress 플러그인 OMGF(현재 50k 이상의 사용자를 보유하고 있음)에 구현되어 있으며 페이지 캐시 파손에 대한 문제는 보고되지 않았습니다.

먼저 템플릿 리다이렉트 출력 버퍼를 시작합니다.

add_action('template_redirect', 'maybe_buffer_output', 3);
function maybe_buffer_output()
{
    /**
     * You can run all sorts of checks here, (e.g. if (is_admin()) if you don't want the buffer to start in certain situations.
     */

    ob_start('return_buffer');
}

그런 다음 HTML에 자체 필터를 적용합니다.

function return_buffer($html)
{
    if (!$html) {
        return $html;
    }

    return apply_filters('buffer_output', $html);
}

그런 다음 필터를 추가하여 출력에 연결할 수 있습니다.

add_filter('buffer_output', 'parse_output');
function parse_output($html)
{
    // Do what you want. Just don't forget to return the $html.

    return $html;
}

도움이 됐으면 좋겠다.

페이지에 영향을 주지 않는 플러그인이 있기 때문에, 이 코드에 문제가 발생했습니다.WordPress에서 출력을 수집하기 위한 베스트 프랙티스에 대한 정보를 찾지 못했습니다.

업데이트 및 솔루션:

KFRIEND의 코드는 WordPress에서 처리되지 않은 소스를 캡처하기 때문에 실제로 브라우저에 표시되는 출력과 동일하지 않습니다.제 솔루션은 콘텐츠를 버퍼링하기 위해 글로벌 변수를 사용하는 것이 우아하지 않을 것입니다.그러나 적어도 브라우저에 전달된 것과 동일한 HTML을 얻을 수 있다는 것은 알고 있습니다.플러그인의 설정이 다르면 문제가 생길 수 있지만, 위의 Jacer Omri의 코드 예 때문에 이렇게 되었습니다.

이 코드는 일반적으로 함수에 있습니다.php는 테마 폴더에 있습니다.

$GLOBALS['oldschool_buffer_variable'] = '';
function sc_callback($data){
    $GLOBALS['final_html'] .= $data;
    return $data;
}
function sc_buffer_start(){
    ob_start('sc_callback');
}
function sc_buffer_end(){
    // Nothing makes a difference in my setup here, ob_get_flush() ob_end_clean() or whatever
    // function I try - nothing happens they all result in empty string. Strange since the
    // different functions supposedly have very different behaviours. Im guessing there are 
    // buffering all over the place from different plugins and such - which makes it so 
    // unpredictable. But that's why we can do it old school :D
    ob_end_flush();

    // Your final HTML is here, Yeeha!
    $output = $GLOBALS['oldschool_buffer_variable'];
}
add_action('wp_loaded', 'sc_buffer_start');
add_action('shutdown', 'sc_buffer_end');

언급URL : https://stackoverflow.com/questions/772510/wordpress-filter-to-modify-final-html-output

반응형