프론트 엔드에 admin-ajax.php 추가 좋은 생각입니까?


17

나는 admin-ajax.php를 좋아합니다. 그러나 프론트 엔드 스크립트를 가리 키기 위해 현지화 해야하는 것이 싫습니다. 테마에 해당하는 찾기 쉬운 파일이 있었으면 좋겠습니다. (또한 프론트 엔드 요청이 "/ wp-admin /"을 통과하는 것을 귀찮게합니다. 실질적인 이유는 추악한 IMO처럼 보입니다.)

그래서 나는 단순히 admin-ajax.php를 "/ajax.php"의 루트 디렉토리에 복사하고 포함 경로를 조정하고 WP_ADMIN 상수 ​​정의를 제거했습니다. 갱 버스터처럼 작동하는 것 같습니다 (이제 모든 프론트 엔드 AJAX 요청을 /ajax.php로 보낼 수 있습니다! 그리고 여전히 플러그인에서 정상적인 wp_ajax 후크를 사용할 수 있습니다!).

그러나 이것이 안전합니까? 무엇이 잘못 될 수 있습니까? 이것이 코어에 내장되어 있지 않기 때문에 이유가없는 좋은 이유가 있다고 가정합니다. 그러나 코드를 살펴보면 즉각적인 문제가 없습니다.

당신은 현명합니다.이 접근법이 미친 지 알려주세요. 또는 내가 간과하는 간단한 방법이 있다면.


자동 업데이트 중에이 파일을 잊어 버려서 놓칠 수 있으며, 이로 인해 보안 취약성이 깨져서 그대로 남을 수 있습니다.
Hemm

답변:


19

일반 permalink 다시 쓰기 규칙보다 .htaccess에 RewriteRule을 사용할 수 있습니다.

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

이제 AJAX 요청을 (으)로 보내고 example.com/ajax업그레이드 후 해당 파일의 핵심 변경 사항을 놓치지 마십시오.


좋은 생각이야! 듣고 난 후에 "그것이 너무 간단하고 명백하다"고 생각하는 것 중 하나입니다. 감사.
MathSmath

귀하의 제안에 따라 재 작성 규칙을 추가했지만 example.com/ajaxURL 404는 추가했습니다. .htaccess이것을 추가 해야하는 정확한 위치에 대해 자세히 설명해 주시겠습니까 ? 나는 현재 ~ 사이 # BEGIN WordPress <IfModule mod_rewrite.c>에 있습니다.</IfModule> # END WordPress
John

작동합니다. 나는 슬래시가 누락되었습니다. / % postname % /
John

7

첫째 : 표준화. 커뮤니티 플러그인을 사용하려는 경우 /ajax.php문서 루트 의 파일 을 신경 쓰지 않을 가능성이 있습니다. 그래서 그들은 그것을 사용하지 않을 것입니다.

모든 것을 직접 굴려도 문제가되지 않습니다.

둘째 : 코어가 업데이트되면 어떻게됩니까? Ajax 파일을 모니터링하고 변경 하시겠습니까?

셋째 :에 admin-ajax.php거주 하고 있음에도 불구하고 wp-admin관리 영역 항목 (예 : 목록 테이블 등)을로드하지 않습니다. 또한 인증을 확인하거나 로그인하지 않은 사용자에게 민감한 것을 노출 시키지도 않습니다. 다시 말해 프론트 엔드 파일과 같습니다. 걱정할 것이 없습니다.

넷째 : 첫 번째 문제와 관련하여 일부 플러그인은 맹목적으로 Ajax 관련 기능을로드하기 전에 확인합니다. 예는 다음과 같습니다. 수정 된 ajax.php는 그로드를 유발하지 않을 것입니다.

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

마지막으로 , Ajax URL을 얻기 위해 현지화를 사용하여 불평하는 것은 좋은 일입니다. 왜? JS 파일은 서버 측 내용을 인식하지 못하기 때문입니다. 사이트가 움직일 때 끊어 질 URL을 열심히 하시겠습니까? 나쁜 선택 인 것 같습니다.

Ajax를 사용하는 모든 스크립트를 현지화하지 않으려면 wp_head실제로 초기에 연결 하여 관리자 ajax URL을 추출하십시오. 문제가 해결되었습니다 (정확히 관리 영역이 수행하는 방식입니다).

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}

고마워 크리스! 모든 유효한 포인트. 내가 깨닫는 데 도움이 된 가장 큰 것은 파일을 수정하지 않고 추가하는 동안 "핵 핵 핵"으로 생각하지 않았지만 실제로 변경 될 수있는 핵심의 다른 기능에 의존하기 때문입니다. . 아니 너무 많은 (또한 핵심 기능 변경 후 죽을 수 있습니다) 다른 플러그인과 다른,하지만 확실히 철학적으로 다른. 생각해 주셔서 감사합니다!
MathSmath

Re : " Third : ... 걱정할 사항이 없습니다. ", wp-admin 디렉토리를 잠그려고 할 때 .htaccess 규칙을 사용하여 알려진 안전한 IP 범위로 제한하는 것은 어떻습니까? ajax-admin.php 파일에 대해 어떤 종류의 예외가 필요하다고 생각합니까? .htaccess 규칙에 관해서는 유감 스럽기 때문에 "예상"이라고 말하고 이것이 가능한지 실제로 알지 못합니까?).
Sepster

단일 파일을 허용하는 것이 가능합니다.
chrisguitarguy

@ chrisguitarguy 이것은 훌륭한 답변입니다, 감사합니다. siteurl을 내 스테이징 / 홈 URL로 리버스 프록시 처리 할 때 프론트 엔드에 admin-ajax를로드하려고합니다. 이것을보십시오 : link 타사 플러그인으로 할 수 있습니까? 내 접근 방식이 올바르지 않습니까?
paranza

5

워드 프레스의 많은 것들과 마찬가지로, 고양이를 껍질을 벗기는 방법은 거의 무한합니다. 허용되는 모든 메소드가 작동하는 동안 프론트 엔드에 ajax 기능을 포함 시키기 위해 wp_localize_script 를 사용하는 것보다 덜 깔끔 합니다.

이것 좀 봐:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of 
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax', 
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

그런 다음 se83650.js파일에서 변수를로 참조하십시오 se83650Ajax.ajaxurl.

이 기술의 장점은이 기능을 시도하고 복제하는 많은 플러그인으로 인해 동일한 변수를 포함하거나 덮어 쓰지 않는다는 것입니다. ajaxurl포함하는 것이 일반적이며, 이것은 당신을 더 포함시키고 다른 개발자들과 더 잘 어울립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.