사용자 정의 테이블에서 $ wpdb-> prefix를 사용해야 하는가?


16

이 질문이 사소한 경우 죄송합니다. WordPress에서 플러그인을 개발하기 시작했습니다.

모든 튜토리얼에서 나는 이것을 발견했다 : 커스텀 테이블을 만드는 동안 $wpdb->prefix사용된다.

예:

$table_name = $wpdb->prefix . "liveshoutbox";

내 질문:

사용해야 $wpdb->prefix합니까? 사용자 정의 테이블에 접두사를 사용하지 않으면 어떻게됩니까?

답변:


22

강제되지는 않지만 필수입니다.

두 개의 Wordpress 사이트가 동일한 데이터베이스에 설정되어있는 시나리오를 고려하십시오. 하나는 접두사가 wp_있고 다른 하나는 wp2_. 접두사를 사용하여 두 사이트 모두에 플러그인을 설치하면 작성된 테이블은 wp_liveshoutbox첫 번째 사이트와 wp2_liveshoutbox두 번째 사이트를 위한 것입니다. 그러나 접두사를 생략하면 두 사이트 모두 동일한 이름의 테이블을 사용 liveshoutbox하게되며 모든 것이 손상됩니다.


12
다시 말해 필수 입니다. :)
Rarst

4

다음을 고려하세요:

플러그인은 각 사이트마다 다른 표 접두사를 사용하는 워드 프레스 네트워크에서 사용됩니다. 플러그인은 동일한 데이터베이스에있는 836 개의 다른 사이트에서 동시에 실행될 수 있습니다.wp_385677_liveshoutbox완벽하게 합리적인 테이블 이름입니다.

플러그인은 보안 개념이있는 사용자가 설치하며 테이블 접두어를 변경하여 봇을 주입하려고 시도합니다. select * from wp_users 하며 시스템 . 그들이 새로운 취약점을 발견하더라도 작동하지 않습니다.

하드 코딩 테이블 이름과 같은 바로 가기를 사용하면 제품을 시작하고 실행할 수 있지만 좋은 방법은 아닙니다. 아주 짧은 시간에 플러그인은 "작동하지 않습니다"라는 주석을 남길 것입니다. 최악의 경우 다른 사람의 사이트를 손상시킬 수 있습니다.

복잡한 쿼리가 있고 작성의 고통을 처리하고 싶지 않으면 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....교체기를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

$query = 'select foo from %table% left join %meta% on %table%.ID = %meta%.meta_id ... ';

$change = array (
    '%table%' => $wpdb->prefix . '_mytable',
    '%meta%'  => $wpdb->prefix . '_mytablemeta'
    );


$sql = str_replace( array_keys( $change ), array_values( $change ), $query );

$results = $wpdb->get_results( $sql );

워드 프레스는 끊임없이 변화하고 있습니다. 오늘날 "작동하는"것은 내일 작동하지 않을 수 있습니다. 이것이 API 함수가있는 이유입니다. Wordpress 개발자는 공개 API 동작이 일관되도록해야합니다 (또는 기능을 감가 상각 할 것임). 내부 메소드 호출이 '빠른 방식'이기 때문에 사용하기 시작하면 일반적으로 다시 물립니다. 소프트웨어에는 진정한 지름길이 거의 없습니다. 필요한 작업을 지금부터 나중에 옮길 수 있으며 신용 카드 "나중에"나중에 더 많은 비용이 듭니다.


이것은 다중 사이트를 언급하기 때문에 대답에서 보지 못한 추가 요소 $wpdb->prefix . "users"는 다중 사이트 설치에서 유효하지 않은 테이블을 생성 한다는 것입니다. db 접두사가 테이블에 첨부되기 때문입니다. 그러나 모든 사용자가 네트워크 사용자이므로 다중 사이트는 하나의 사용자 테이블 만 사용합니다. 따라서 쿼리에 wp_users 또는 wp_usermeta 테이블이 포함 된 경우 $wpdb->users또는 $wpdb->usermeta각각 을 사용해야합니다 .
butlerblog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.