prosource

wordpress에서 id로 게시물 존재 여부

probook 2023. 2. 12. 18:01
반응형

wordpress에서 id로 게시물 존재 여부

ID가 있습니다.

$id = 151;

다음과 같이 존재 여부를 확인합니다.

$content = get_post($id);
if ($content)
    echo "post $id already exists";
else
    echo "post $id does not exists or was deleted";

그러나 WP 포럼에서는 DB보다 항상 다음과 같이 질문하는 것을 선호하는 것으로 보입니다.

global $wpdb;
$post_exists = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE id = '" . $id . "'", 'ARRAY_A');
if ($post_exists)
    echo "post $id exists";
else
    echo "post $id does not exist";

그럼 어떤 방법이 가장 좋을까요?사실 나는 첫 번째 것 보다 쉬운 것을 선호한다.

가능한 한 데이터베이스에 직접 문의하는 것이 최선이라고 생각합니다.

get_post_status() 함수를 사용할 수 있습니다.

게시물이 존재하지 않으면 false를 반환합니다.

if ( get_post_status( $post_id ) ) {
    // do stuff
}

또는 게시물이 게시되었는지 확인하기 위해

if ( 'publish' === get_post_status( $post_id ) ) {
    // do stuff
}

https://developer.wordpress.org/reference/functions/get_post_status/

if( is_null(get_post($id))){

      echo "post $id does not exists or was deleted";

}else{

       echo "post $id already exists";

}

아주 오래된 우편물인 건 알지만 그래도...특정 ID의 게시물이 존재하는지 여부를 확인하려면 get_permalink wordpress 기능을 사용할 수도 있습니다.

예:

if( get_permalink( $post_id ) ):
echo "does exist";
else:
echo "does not exist";
endif;

get_permalink 함수는 투고뿐만 아니라 페이지, 첨부 링크도 반환합니다.

WP_Query 클래스를 사용하면 효율적이고 SQL이 필요 없는 솔루션을 얻을 수 있습니다.

$id = 151;

$post_exists = (new WP_Query(['post_type' => 'any', 'p'=>$id]))->found_posts > 0;

if ($post_exists)
    echo "post $id already exists";
else
    echo "post $id does not exists or was deleted";

get_post_statusget_permalink는 모두 관련 없는 데이터를 로드합니다.

여기서 영감을 얻기 위해 기존의 핵심 코드를 찾아보기로 했습니다.post_exists에는 이미 기능이 있지만 제목, 내용, 상태 등을 확인할 뿐입니다.여기서 모든 소스를 볼 수 있습니다.

코어의 코드는 실제로 데이터베이스에 직접 문의하고 ID만 가져옵니다.게시물 전체의 모든 데이터는 아닙니다.이것은 매우 효율적이며 이 방법을 모방할 가치가 있습니다.제가 생각해낸 것은 다음과 같습니다.

<?php
if ( ! function_exists( 'post_id_exists' ) ) :
    function post_id_exists( $post_id ) {
        global $wpdb;
        $post_id = (int) $post_id; // cast as INT to sanitize
        if ( $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE ID=%s", array( $post_id ) ) ) ) {
            return 1;
        }
        return 0;
    }
endif;

승인된 답변은 "db를 가능한 한 적게 직접 쿼리"입니다.새로운 WordPress 개발자를 위한 일반적인 조언입니다.그러나, 커스텀 코드에 직접 데이타베이스 콜을 반복해 분산시키는 것을 피하고, 기존의 기능이 이미 필요한 것을 실행하고 있는 경우는 직접 데이타베이스 콜을 회피하는 것이 좋다고 생각합니다.이 경우 핵심 기능에 포함되기를 바라지만 핵심 기능을 효율적으로 수행할 수 있는 방법은 없습니다.이 드문 경우지만 데이터베이스를 조회하는 함수를 작성하고, 이를 효율적이고 안전하게 수행하기 위한 모델로서 코어 코드를 활용해야 합니다.

get_post,get_permalink여기서 권장하는 기타 기능들은 모두 가능한 한 빠르게 쿼리를 구축한 목적별 기능보다 효율성이 훨씬 떨어지는 특정 목적을 가지고 있습니다. 다른 했듯이, 이 에도 시사하는 , 시사하다, 시사하다, 시사하다, 시사하다, 시사하다, 시사하다, 시사하다, 시사하다, 시사하다, 시사하다, 시사하다.get_post_status 불리다get_post그래서 효율이 더 떨어집니다.

get_post 콜보다 데이터베이스에 문의하는 것이 좋습니다.

투고 내용의 크기가 클 수 있습니다.게시물이 존재하는지 확인하기 위해 게시물의 전체 내용을 조회하고 문자열로 푸시하는 것은 매우 낭비적이고 비효율적입니다.

데이터베이스에 직접 문의하지 않을 경우 get_post_field를 사용하여 작은 필드 중 하나를 가져오는 것이 효과적이지만 낭비는 줄일 수 있습니다.

콜에 함수를 부여하면 호출할 수 있습니다. 함수에 의해 제공되지 않는 것을 위해 데이터베이스를 사용합니다.

언급URL : https://stackoverflow.com/questions/9638375/check-existence-of-a-post-by-id-in-wordpress

반응형