WordPress의 모든 게시물 업데이트는이 wp_update_post
기능으로 처리됩니다 .
이 함수에는 몇 가지 기본값이 있으며 기본값 post_content_filtered
은 ''(빈 문자열)입니다.
기본값이 함수를 통해 전달 된 arg와 병합되면 wp_parse_args
게시물이 업데이트되고 post_content_filtered
명시 적으로 전달되지 않을 때마다 빈 문자열로 설정됩니다.
이제 우리는 물을 수 있습니다 : post_content_filtered
명시 적으로 언제 전달 wp_update_post
됩니까? 답은 : WordPress 가 아닙니다 .
첫 번째 질문은 다음과 같습니다.
다른 상황에서는 post_content_filtered 열의 데이터가 지워 집니까?
짧은 대답은 어떤 이유로 든 게시물이 업데이트 될 때마다 입니다.
하나의 필드를 변경하는 것을 주 입니다 업데이트가, 특히, 모든 상태 변경은 업데이트, 휴지통으로 게시, (게시물 삭제)를 게시 할 수있는 미래를 게시 보류 게시 할 예 초안, 등등입니다 ...
게시물에서 무언가가 변경 post_content_filtered
되면 지워집니다. 예외적 post_content_filtered
으로는에 명시 적으로 전달 될 때만 예외이며 wp_update_post
이미 언급했듯이 이는 WordPress에서 수행되지 않습니다.
이 문제가 전혀 발생하지 않도록하는 방법이 있습니까? (데이터가 영구적으로 저장되도록하는 방법이 있습니까?
코드를 사용하여 해당 필드를 만들고 유지하려는 경우 WordPress에서 수행하는 모든 업데이트 를보고 변경을 방지해야합니다.
이것은 어려운 일처럼 들릴 수 있지만이 대답의 첫 번째 문장 인 " WordPress의 모든 게시물 업데이트는 wp_update_post
함수에 의해 처리됩니다 "를 읽으면 필요한 유일한 것은 해당 함수를 보는 것입니다. .
내가 제안하는 후크는 wp_insert_post_data
두 가지 이유입니다.
- 업데이트 전에 실행 되므로 복구 할 필요는 없지만 예방할 수 있습니다
- 함수가 업데이트 할 데이터와 전달 된 매개 변수 배열 (업데이트의 경우)에 게시물의 ID가 포함 된 2 개의 매개 변수를 전달합니다.
따라서 간단한 내용 get_post
을 사용하여 게시물의 현재 상태와 게시물의 상태를 비교할 수 있습니다. 마음에 들지 않는 경우 변경할 수 있습니다.
코딩하자 :
add_filter( 'wp_insert_post_data', 'preserve_content_filtered', 999, 2 );
function preserve_content_filtered ( $data, $postarr ) {
/* If this is not an update, we have nothing to do */
if ( ! isset($postarr['ID']) || ! $postarr['ID'] ) return $data;
/*
* Do you want you filter per post_type?
* You should, to prevent issues on post type like menu items.
*/
if ( ! in_array( $data['post_type'], array( 'post', 'page' ) ) ) return $data;
/* How post is now, before the update */
$before = get_post( $postarr['ID'] );
/* If content_filtered is already empty we have nothing to preserve */
if ( empty( $before->post_content_filtered ) ) return $data;
if ( empty( $data['post_content_filtered'] ) ) {
/*
* Hey! WordPress wants to clear our valuable post_content_filtered...
* Let's prevent it!
*/
$data['post_content_filtered'] = $before->post_content_filtered;
}
return $data;
}
이전 기능이 모든 post_content_filtered
청소를 방해하는 문제가있을 수 있습니다 . 그리고 당신 이 어떤 이유로 든 그것을 지우고 싶다면?
모든 WP 게시물 변경은에 의해 처리 wp_update_post
되지만 WordPress는 아닙니다.
다음과 같은 함수를 작성할 수 있습니다.
function reset_post_content_filtered( $postid ) {
global $wpdb;
$wpdb->query( $wpdb->prepare(
"UPDATE $wpdb->posts SET `post_content_filtered` = '' WHERE `ID` = %d", $postid
) );
}
수있는 Being $wpdb
쿼리, 재설정이 문제없이 완료 그래서, 우리의 필터를 유발하지 않으며, 어디서나 코드에서 재설정 할 필요가 post_content_filtered
,이 함수를 호출 할 수 있습니다.
'컨텐츠 필터링 됨'버튼으로 메타 박스를 생성 할 수도 있으며이 버튼을 클릭하면 reset_post_content_filtered
Ajax를 통해 함수를 호출하기 만하면 됩니다.