데이터베이스의 'post_content_filtered'열이 WordPress에 의해 언제 지워 집니까?


29

일부 WordPress 플러그인은 (아주 드물지만) post_content_filtered데이터베이스 의 열을 사용하여 게시물과 관련된 일부 데이터를 저장합니다.

예를 들어 Save on Markdown 은 게시물의 마크 다운 버전을 post_content_formatted열에 별도로 , 구문 분석 된 HTML을 post_content열에 저장하므로 플러그인이 비활성화 될 때 게시물이 Markdown을 제거하지 않습니다 (HTML이에 저장되어 있기 때문 post_content).

이제 post_content_filtered임시 저장소에 거의 사용 된다는 것을 알게 되었습니다. 즉, 열의 내용이 손실되거나 지워집니다.

  • '빠른 수정'옵션을 사용하여 게시물 (제목, 태그, 카테고리 등)을 변경합니다

  • 예약 된 게시물이 (자동으로) 게시됩니다

  • 게시물을 일괄 수정합니다.

  • 당신은 게시물의 개정 사이를 전환

  • 게시물은 외부 편집기에서 저장됩니다 (예 : WordPress 게시물 편집기가 아님).

질문 :

  1. 다른 상황에서는 post_content_filtered열의 데이터가 지워 집니까?

  2. 이 문제가 전혀 발생하지 않도록하는 방법이 있습니까? (데이터를 영구적으로 저장하고 post_content열이 처리 되는 방식을 확인하는 방법이 있습니까?)

답변:


29

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_filteredAjax를 통해 함수를 호출하기 만하면 됩니다.

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