사용자 정의 플러그인 페이지 작업을 가장 잘 처리하려면 어떻게해야합니까?


21

나는 끊임없이 같은 성가심에 빠져 있습니다. 그래서 아이디어 나 경험이 있는지 알 수 있다고 생각했습니다 ...

자체 관리 페이지를 사용하는 플러그인을 만들었습니다. 그렇습니다. 이제 WP_List_Table () 항목을 정렬 했으므로 훌륭하다고 말해야하지만 .....

admin.php?page=...플러그인 디렉토리에서 직접로드하지 않는 한 사용자 정의 플러그인 페이지는 항상로드됩니다 . 이제 해당 페이지에서 '작업'을 수행하는 경우 어떻게 든 처리 한 다음 action 매개 변수 없이 페이지로 다시 리디렉션해야합니다 . 내가 GET 또는 POST를 수행하더라도 실제로.

모든 내부 페이지에서 WP는 동일한 페이지에서이 작업을 수행하며, 작업이 있는지 확인한 다음 처리하면 작업없이 자체로 리디렉션됩니다. 이 페이지에는 admin-header아직로드되지 않았기 때문에 가능합니다 .

그러나 자신의 페이지에서 시도하면 관리자 인터페이스의 절반이 이미 브라우저로 전송되었으므로 더 이상 리디렉션이 불가능합니다. 분명히 해결책은 다른 페이지에 직접 POST / GET하고 WP 프레임 워크를로드하고 처리 한 다음 원래 페이지로 다시 리디렉션하는 것입니다 ...하지만 ... 내 원래의 이유 때문에 약간 성가신 것입니다. 페이지는 콜백을 통해로드되므로 내 클래스의 메소드 내에서 실행됩니다. 아름답습니다.

별도의 페이지를로드하면 수동으로 포함 wp-load.php하고 클래스 외부에 있어야합니다 . 이는 성가신 일이며, 특히 플러그인 클래스를 익명으로 설정하여 아무도 액세스 할 수 없기 때문에 특히 버그가 있습니다. 외부에서.

이 긴 이야기가 끝나면 ... 관리자 인터페이스를 미리 설정 하지 않고 콜백 통해 다른 페이지를로드하는 좋은 솔루션을 만든 사람이 있습니까?

(해결 방법을 알고 있습니다 ... load-....작업 매개 변수를 확인하고 처리 및 리디렉션을 수행 하는 함수를 연결할 수 는 있지만 더 좋은 방법이 있는지 궁금합니다.)

감사.


왜이 태그가 [plugin-wp-pagenavi]있습니까? [plugin-development]확실히 환영합니다.
Jan Fabry 2019

@ Jan Fabry : 무엇 plugin-wp-pagenavi을위한 것인지 확실하지 않습니다 ... 나는 플러그인과 관리자 메뉴의 상관 관계에 관한 것이라고 가정했습니다. 내 질문은 그와 관련이 있기 때문에 해당 태그를 선택했습니다.
wyrfel

WP-PageNavi 는 프런트 엔드를위한 고급 페이징 탐색 기능이있는 플러그인입니다. [admin-menu]여기서 사용할 수는 있지만 실제로는 관련이 없다고 생각합니다. 태그를 원하는대로 변경했습니다. 물론 다시 편집 할 수 있습니다.
Jan Fabry

@Jan Fabry : 태그를 다시 작성해 주셔서 감사합니다. 전체 태그 풀에 익숙하지는 않습니다.
wyrfel

답변:


28

경험상 대부분의 작업에는 POST 요청을 사용하여 실수로 실행 되지 않도록해야 합니다. 그러나 POST 요청 후 일반 페이지로 리디렉션하여 사용자가 페이지를 새로 고칠 때 중복 실행을 방지하는 것이 좋습니다.

흐름은 다음과 같습니다.

  1. POST 양식이 포함 된 플러그인 페이지
  2. 요청을 처리하고 페이지로 리디렉션되는 페이지
  3. 작업 결과를 보여주는 플러그인 페이지

중간 페이지는 플러그인 페이지 일 필요는 없습니다. 이 방법은 당신이 사용할 수있는 "일반적인 POST 처리기" 3 년 전에 포함 된, 에 후크를 .'admin_action_' . $_REQUEST['action']admin.php

사용자 예는 Akismet 플러그인 입니다. 안정적으로 사용 하려면 포함하는 다른 페이지가 아닌 직접 제출해야합니다admin.phpadmin.php .

사용 방법의 매우 기본적인 예는 다음과 같습니다.

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}

Hei, 나는 코드를 다시 볼 것이다. 분명히 그것을 보지 못했지만 확인하기 만하면 ... 페이지 매개 변수없이 admin.php를 직접 호출하면 모든 페이지를 건너 뜁니다. 로딩하고 일부 초기화를 수행하고 후크를 실행합니까? 그것은 멋질 것입니다 ... ish (나는 여전히 페이지 로딩 전에 훅을 넣지 않은 이유를 얻지 못합니다).
wyrfel

@wyrfel : 그렇습니다. admin.php직접 전화 하는 것은 Akismet 소스가 가르쳐 준 "트릭"입니다. 당신이 양식을 표시 할 때 맞았고 오류가 발생하면 다시 표시하려고합니다. 대상이 플러그인 페이지이지만 시작 부분에 후크가 있으면 쉽습니다 (성공하면 리디렉션하거나 표시 할 수 있음) 그렇지 않으면 오류 메시지와 함께 다시 작성하십시오. Trac 티켓으로 제안 하시겠습니까?
Jan Fabry

티켓을 제출하겠습니다. 해결 방법으로, 나는 'load-<pagehook>'작동 하는 후크를 발견했습니다 ... 페이지가로드되기 전에 호출되었지만 admin_action_...개념은 훨씬 더 훌륭하고 구체적으로 보입니다. 또한 POST를 수행하고 다시로드 할 때 다시 게시하지 않으려는 경우 오류 메시지는 여전히 문제가되지만 다른 주제입니다.
wyrfel

@ wyrfel : 왜 오류 메시지가 여전히 문제가됩니까? 오류 메시지가있는 경우, 페이지에 머물러 메시지와 함께 양식을 다시 표시하십시오 (물론 새로 고침은 여기에서 의미가 없지만 오류가 여전히 존재하고 아무런 조치도 취하지 않기 때문에 해를 끼치 지 않습니다) 실행). 오류가 없으면 조치를 실행하고 "안전한"개요 페이지로 경로 재 지정하십시오. admin_action_플러그인 페이지 로더 이전에 후크가 이동 하면 작동 합니다.
Jan Fabry

좋아 ... 나는 너무 복잡하다고 생각했다.
wyrfel

3

사용자가 제출 한 페이지의 작업 URL에 noheader = true를 추가하여 간단히 다르게 접근했습니다.

내 핸들러는 조치 (예 : 일반적으로 추가, 업데이트 또는 삭제)를 수행 한 후 다음 페이지 조치 (예 : 페이지 추가-> 페이지 편집, 페이지 삭제-> 목록 페이지, 페이지 편집-> 페이지 편집)로 wp_redirect ()로 완료합니다. ). 또한 URL에 메시지를 전달하여 업데이트 성공 또는 실패와 같은 상태를 표시 할 수 있습니다.

이 접근 방식은 동일한 클래스 및 동일한 관리자 슬러그로 목록, 추가, 편집, 삭제, 일괄 삭제 등의 모든 작업을 유지하므로 유지 관리 및 이해가 매우 쉽습니다.


당신은 천재입니다! 나는 이틀 동안 고군분투하고 있었고 필요한 것은 "noheader = true"부분이었습니다. 감사!
r00m

0

또 다른 접근 방식은 숨겨진 입력 필드를 양식에 추가하는 것입니다.

<input type="hidden" name="page" value="your-page-slug" />

이렇게하면 WordPress가 리디렉션을 자동으로 처리하는 것처럼 보입니다.

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