programing

게시 시 Wordpress 게시 상태 수정

sourcejob 2023. 10. 26. 20:59
반응형

게시 시 Wordpress 게시 상태 수정

관리자 패널 게시물 편집 페이지에서 사용자 지정 게시물 유형의 필드를 확인하려고 합니다.

사용자가 "Publish"를 클릭하면 POST 데이터에서 필드의 유효성을 검사하고, 데이터가 테스트를 통과하지 못하면 post_status를 "pending"으로 변경합니다.이런 경우 관리자 공지사항 영역의 페이지에 오류도 추가하고 싶습니다.

저는 wp_insert_post 동작에 후크를 추가하여 사용해 왔습니다. 이는 또한 우리 자신의 데이터를 저장합니다.연산 순서는 잘 모르겠지만 wp_insert_post 이벤트가 먼저 발생한 다음 후크를 통해 함수가 호출된다고 가정합니다.

문제는 포스트 퍼블리싱 작업을 하는 것이 워드프레스 기능이기 때문에 데이터 검증을 할 때쯤 워드프레스는 이미 '퍼블리싱' 상태로 게시물을 저장해 놓았습니다.제가 해야 할 일은 해당 업데이트를 방지하거나 상태를 다시 "보류 중"으로 변경하는 것이지만 API 내에서 이를 수행할 방법을 찾는 데는 거의 성공하지 못하고 있습니다.

다음은 제가 수행하고자 하는 작업 순서입니다.

1. admin user edits post data and clicks "Publish"
2. via wp_insert_post, my data validation and post meta save routine is called
3. If data passes validation, post status is "published"
4. Otherwise, post status set to "pending" & message shown in admin notice area

누군가가 이런 짓을 한 것은 확실하지만, 광범위한 구글 검색은 저를 겉보기에는 전혀 무관해 보이는 똑같은 페이지로 이끌 뿐입니다.누가 여기서 올바른 방향을 가르쳐 줄 수 있습니까?미리 감사드립니다.

업데이트:

따라서 Richard ML이 옳았습니다. wp_insert_post_data filter에 연결하면 admin post 편집 페이지 필드의 유효성을 검사할 수 있는 적절한 위치가 제공되었습니다.하지만 나머지 해결책이 무엇인지, 구체적으로 관리자 알림 영역에 이유를 보고하기 위해 이 내용을 업데이트합니다.

우선 admin 페이지는 리디렉션의 결과이므로 데이터를 출력하거나 필드를 설정할 수 없으며 admin_notice 작업을 다시 렌더링할 때는 이미 사라집니다.그 속임수는 제가 다른 포럼에서 배운 것이고, 그것은 진부하지만, 효과가 있습니다.

오류를 표시해야 한다고 판단되면 set_option()을 사용하여 고유한 이름을 가진 블로그 옵션을 추가하는 것이 유효성 검사 필터 기능입니다('publish_errors'를 사용했습니다).이 코드는 "error" 클래스가 있는 div의 HTML 코드여야 합니다.

또한 'admin_notice'에 대한 액션 훅을 추가해야 하는데, 이는 'errors_publish' 옵션이 있는지 확인하는 기능을 가리키며, 이를 찾으면 페이지에 출력한 후 delete_option으로 삭제합니다.

포스트 데이터를 데이터베이스에 삽입하기 전에 필터를 사용하여 검사하고 수정할 수 있습니다.


당신의 업데이트에 대한 대응으로 데이터베이스에 옵션을 일시적으로 추가할 필요는 없다고 생각합니다.Wordpress 리디렉션에 쿼리 문자열 변수를 간단히 추가할 수 있어야 합니다.

add_filter('wp_insert_post_data', 'my_post_data_validator', '99');
function my_post_data_validator($data) {
  if ($data['post_type'] == 'post') {
    // If post data is invalid then
    $data['post_status'] = 'pending';
    add_filter('redirect_post_location', 'my_post_redirect_filter', '99');
  }
  return $data;
}

function my_post_redirect_filter($location) {
  remove_filter('redirect_post_location', __FILTER__, '99');
  return add_query_arg('my_message', 1, $location);
}

add_action('admin_notices', 'my_post_admin_notices');
function my_post_admin_notices() {
  if (!isset($_GET['my_message'])) return;
  switch (absint($_GET['my_message'])) {
    case 1:
      $message = 'Invalid post data';
      break;
    default:
      $message = 'Unexpected error';
  }
  echo '<div id="notice" class="error"><p>' . $message . '</p></div>';
}

언급URL : https://stackoverflow.com/questions/5007748/modifying-wordpress-post-status-on-publish

반응형