게시물을 게시하기 전에 사용자 정의 필드의 유효성을 검사하기위한 작업 필터 / 후크가 있습니까?


11

이라는 사용자 정의 파일이 xxxx_url있습니다. xxxx_url고유해야합니다.

게시물을 게시하기 전에 xxxx_url고유 한지 확인하고 싶 습니까? 고유하지 않은 경우 게시물 게시가 거부되어야합니다.

나는 노력했다 publish_post. 그러나 게시물을 게시 할 때 트리거되기 때문에 올바른 것은 아닙니다. 게시 직전에 코드를 실행하고 싶습니다.


1
현재 게시물 ID를 고유 한 값으로 설정하지 않는 이유는 무엇입니까? 좋아요 : 게시물 ID는 132_url어디에 있습니까 132? 당신은 항상 여기에서 독특한 가치를 가지고 있습니다. 그 외에도 : 사용자 정의 필드는 save_post작업에 저장해야합니다 . 이 작업에서 사용자 정의 필드 (예 : 비어 있지 않고 고유 한 값이있는 경우)를 확인하고이를 기반으로 확인할 수 update_post_meta있습니다. 사용자 정의 필드를 확인하고 고유 한 값이 없으면 post-statusto draft또는 다른 것을 설정하여 게시를 비활성화 할 수 있다고 생각합니다 . 그렇지 않으면 jQuery가 필요하다고 생각합니다.
LWS-Mo

답변:


5

시작 부분에 wp_insert_post게시물을 저장 / 업데이트하는 기능인이라는 필터가 wp_insert_post_empty_content있습니다. 기본적으로이 필터는 제목, 편집기 및 발췌 필드가 모두 비어 있는지 확인합니다.이 경우 저장 프로세스가 중지됩니다.

그러나 저장할 모든 필드가이 필터로 전달되므로이 필터를 확장하여 게시물을 비워야하는지 여부를 결정하는 다른 테스트를 포함 할 수 있습니다. 다음과 같습니다.

add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {

  // extract custom field from $postarr, check uniqueness

  if ($unique) return false else return true;
  }

참고 : 저장 프로세스를 중단하려면 함수가 'true'를 반환해야합니다.

사용자 정의 필드가 고유하지 않은 경우 경고를 표시 할 수도 있습니다.


2
아마도 효과가 있을지 모르지만 솔루션보다는 해킹처럼 보입니다. 나는 이것도 고려했지만 나중에 빈 내용을wp_insert_post_empty_content 의미 적 으로 게시하는 것을 게시하지 않기로 결정했습니다 . 그 말에도 불구하고, 나는 이것의 의미 론적으로 올바른 후크를 찾지 못했습니다.
Scott

제목과 내용이 비어있는 경우에만 개발자를위한 필터가 없습니다.
cjbj

1
단순한 단어 '빈'에 덜 집중한다면이 필터는 게시물이 저축에 필요한 최소 요구 사항을 충족하는지 확인하는 것입니다. OP는 최소 요구 사항을 확대하고자합니다. 어쩌면 필터는 wp_insert_post_valid_content그 이름 을 나타 내기 위해 이름 을 지정해야 하지만 나머지는 정확히 올바른 위치에 있습니다.
cjbj

@cjbj 이와 같은 질문이있을 때 올바른 필터를 어떻게 찾습니까? 내 말은, 어떻게 wp_insert_post_empty_content필터 를 찾았 어 ?
나는 가장 멍청한 사람이다.

1
글쎄, 당신이 한동안 WP와 함께 일했을 때, 당신은 코드의 어느 부분이 관리자의 어떤 부분을 생성하는지 알고있다. 따라서 파일을 찾아보고 사용 가능한 필터가 있는지 소스 코드를 확인하십시오.
cjbj

1

게시를 위해 게시물을 제출하기 전에 AJAX를 사용하여 고유성을 확인하는 것은 어떻습니까?

$( '#post' ).on( 'submit', function( event ) {
  event.preventDefault(); // Prevent publishing

  //Now do some AJAX Checks
  $.post( ajaxurl, data, function(response) {
    if ( response === 'success' ) {
        $( this ).off( event ).submit();
    } else {
        alert( 'The custom field must be unique' );
    }
  });
});  

코드는 테스트되지 않았지만 작동해야합니다. 원하는 결과를 얻기 위해 게임을해야 할 수도 있습니다.


0

wp_insert_post_data 필터에 연결 하고 게시물 삽입을 차단하고 싶지 않다는 것을 이해하기 때문에 중복 메타 값으로 게시물을 게시하지 않기를 원하기 때문에 가능한 한 덜 방해가됩니다.

코드를 공유하지 않았기 때문에이 경우 너무 많이 절약 할 수 없지만 다음은 작동하는 필터의 의사 코드입니다.

function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
    // setup an uniqueness flag.
    $meta_is_unique = true;

    // check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
    // {...} <- your code

    // if the meta is NOT unique keep the post status in draft.
    if ( ! $meta_is_unique ) {
        // you can force the current post to be draft until the meta value will became unique.
        $data['post_status'] = 'draft';
        // maybe, update the meta value with a hint of the fact that it's not unique.
        // or display a dashboard notice about it.
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );

이 필터의 또 다른 장점은 첨부 파일 one과 분리되어 있다는 것 wp_insert_attachment_data입니다.

도움이 되었기를 바랍니다.


2
좋은 생각이 아닐 수도 있습니다. 어떤 경우 $data['post_status']이다 publish와 사용자가이를 업데이트하고? 게시물 을 해당 게시물 draft404이슈 로 만들지 않습니까?
Scott

@Scott 즉, 게시 된 게시물이 메타 값이 고유하지 않다는 것을 저장시 감지하면 게시물 게시를 거부하고 게시물을 작성해야합니다. 다시 말하지만 메타 값이 얼마나 중요한지 알지 못하지만 정렬 데이터 유형이거나 필수적인 경우 게시 상태는 초안이어야합니다 (404 문제를 의미하지는 않습니다). 공개보기에서 은퇴)
Andrei

-1

확인은로 이동해야합니다 wp_insert_post. 이 후크는 게시물이 게시되거나 편집 될 때마다 시작됩니다.

여기에서 xxxx_url값 이 같은 게시물이 있는지 확인하기 위해 사용자 지정 쿼리를 수행 할 수 있습니다 .

add_action('wp_insert_post', function($post_id) {
    $meta_key = 'xxxx_url';
    $meta_value = get_post_meta($post_id, $meta_key, true);
    $query = new WP_Query([
        'post_type' => get_post_type($post_id),     // This might be unnecessary, if you check `post` post type only. Or use `any`.
        'meta_query' => [
            [
                'meta_key' => $meta_key,
                'meta_value' => $meta_value,
            ]
        ]
    ]);
    if ($query->have_posts()) {
        // invalid key, post with the same value already exists
    } else {
        // valid, key was not found anywhere
    }
});

3
아시다시피, wp_insert_post게시물이 저장되면 액션이 실행 된 후 if / else 명세서 게시물에 작성한 내용이 게시되므로 게시 또는 게시물 삽입을 차단할 수 없습니다.
나는 가장 바보 같은 사람이다

게시물의 유효성 검사에 실패한 경우 게시를 차단 하시겠습니까? 당신은 당신의 질문에 그것을 쓰지 않았습니다.
Petr Cibulka

나는 If it isn't unique it should reject publishing post.내 질문에 그것을 분명히 언급 했다.
나는 가장 바보 같은 사람이다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.