wpdb 클래스를 사용자 정의하고 새 메소드를 추가하는 방법
게시 됨: 2018-07-10더 일반적으로 wpdb로 알려진 WordPress 데이터베이스 추상화 계층은 데이터베이스와 상호 작용하는 ezSQL 기반 클래스입니다. wpdb 클래스는 유사한 기능을 가진 다른 코드로 쉽게 교체할 수 있는 핵심 WP 코드의 일부이기도 합니다(최신 드롭인 목록은 WP 코드 참조에서 제공됨).
기본 #wpdb 클래스를 수정하는 것은 복잡하지 않습니다. 몇 가지 방법만 쉽게 추가, 제거 또는 수정할 수 있습니다. 전체 클래스를 교체할 필요가 없습니다. #워드프레스
트윗하려면 클릭여기서 큰 오해가 생깁니다. 사람들은 "내 자신의 완전한 데이터베이스 클래스 작성"에서 "대체"를 인식합니다. 다행히도 전체 데이터베이스 클래스를 작성할 필요는 없습니다. 기존 클래스를 가져와 필요한 기능만 추가, 제거 또는 수정할 수 있습니다. 그리고 그것이 우리가 할 일입니다.
wpdb 클래스를 수정하는 이유는 무엇입니까?
확실히 wpdb에는 필요한 모든 것이 있습니다!? 전체 WP는 그 위에 구축됩니다. 기술적으로 맞습니다. $wpdb->query()
메서드를 사용하면 모든 SQL 명령을 실행할 수 있습니다. 그러나 해당 논리가 적용되면 $wpdb->insert()
또는 $wpdb->get_var()
와 같은 메서드가 없거나 필요하지 않습니다. 그러나 시간을 절약하고 버그를 줄이며 잘못된 쿼리를 제거하기 때문에 그렇게 합니다. 그렇다면 어떤 기능이 빠졌습니까? 작업 중인 프로젝트에 따라 다릅니다. 다음 두 쿼리에 대한 지원이 필요했습니다.
INSERT IGNORE INTO tbl_name ...
INSERT INTO tbl_name ... ON DUPLICATE KEY UPDATE ...
1단계 – 드롭인 생성
DB 드롭인을 생성하는 과정은 간단하며 최종 결과는 WP에 매끄럽게 혼합됩니다.
db.php
라는 파일을 만들고 /wp-content/
폴더에 넣습니다. 파일에 표준 플러그인 헤더를 제공하고 wpdb를 확장하는 클래스를 만듭니다. 이 같은:
<?php /* Plugin Name: Extended wpdb Description: A few extra functions for wpdb Version: 1.0 Author: WebFactory Ltd */ class wpdb_extended extends wpdb { public function __construct(){ parent::__construct( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); } public function test() { echo 'Extended wpdb is running.'; } } global $wpdb; $wpdb = new wpdb_extended();
헤더는 꽤 자명합니다. 구성 메서드는 개체가 구성되고 이를 위해 원래 wpdb 생성자를 사용하면 새 DB 연결을 생성하는지 확인합니다. 이러한 DB 상수는 wp-config.php
에 정의되어 있습니다. 처음에 말했듯이 우리는 일부 기능을 추가하고 나머지는 모두 재사용합니다. 두 번째 메서드 test()
는 순전히 모든 것이 올바르게 작동하는지 확인하는 것입니다.
마지막 두 줄이 중요합니다. 이것은 사용자 정의 클래스이므로 WP는 자동으로 $wpdb
개체를 생성하지 않습니다. 우리 스스로 해야 합니다. 그렇지 않으면 지역 변수를 생성하게 되므로 global
키워드를 사용하는 것을 잊지 마십시오.
2단계 – 더 깊이 파고들기 전에 테스트
WP 대시보드를 열고 플러그인으로 이동합니다. 일반적인 전체, 활성 및 비활성(플러그인) 탭 외에 드롭인 탭이 있으며 그 안에 마술처럼 사용자 지정 데이터베이스 클래스가 있습니다.
관리자가 제대로 작동하고 있기 때문에 우리가 잘했다는 것을 알고 있습니다. 우리의 새로운 맞춤형 확장 클래스가 있으며 변경된 사항은 없습니다. 엄청난! 그러나 좋은 측정을 위해 다음 세 줄의 코드를 테마의 functions.php
(또는 플러그인이 즉시 실행될 플러그인 내부)에 넣습니다.
global $wpdb; $wpdb->test(); die;
관리자 또는 프런트 엔드 페이지를 실행하면 무엇을 볼 수 있습니까? " 확장 wpdb가 실행 중입니다. " 완벽한. 이제 실제 기능에 대해 설명합니다.
3단계 – 기능 생성, 수정 또는 교체
INSERT IGNORE
쿼리는 매우 쉽게 수행할 수 있습니다. 이미 $wpdb->insert()가 있으므로 한 단어가 누락되었습니다. 불행히도 적절한 위치에 필터가 없기 때문에 두 줄의 코드가 되지 않습니다.
wp-db.php를 열고 #2100행의 insert()
메소드로 이동하면 #2151행의 _insert_replace_helper()
메소드를 사용하는 것을 볼 수 있습니다. 그리고 그 기능에는 단일 필터나 작업이 없습니다. 함수는 즉시 쿼리 결과를 반환하고 수정할 수 있는 쿼리 자체는 반환하지 않기 때문에 함수를 래핑할 수 없습니다. 버머. insert()
및 _insert_replace_helper()
메서드를 모두 재정의해야 합니다. 추가 매개변수 $ignore
를 추가합니다. 기본값이 false
인 부울입니다.
public function insert( $table, $data, $format = null, $ignore = false ) { return $this->_insert_replace_helper( $table, $data, $format, 'INSERT', $ignore = false ); }
다른 상황에서는 5개의 매개변수가 있는 함수가 매개변수를 연관 배열로 바꾸는 좋은 후보가 될 것입니다. 그러나 우리는 이전 버전과의 호환성을 원하므로 그렇게 하지 않습니다. 다른 기능에 대한 변경도 미미합니다.
function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT', $ignore = false ) { $this->insert_id = 0; if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) { return false; } $data = $this->process_fields( $table, $data, $format ); if ( false === $data ) { return false; } $formats = $values = array(); foreach ( $data as $value ) { if ( is_null( $value['value'] ) ) { $formats[] = 'NULL'; continue; } $formats[] = $value['format']; $values[] = $value['value']; } $fields = '`' . implode( '`, `', array_keys( $data ) ) . '`'; $formats = implode( ', ', $formats ); // modification for IGNORE keyword if (true == $ignore && 'INSERT' == $type) { $type = 'INSERT IGNORE'; } $sql = "$type INTO `$table` ($fields) VALUES ($formats)"; $this->check_current_query = false; return $this->query( $this->prepare( $sql, $values ) ); }
개발자가 이 작업을 더 자주 수행하지 않는 이유는 무엇입니까?
사용자 정의 쿼리가 몇 번만 필요한 경우 $wpdb->query()
를 쉽게 사용할 수 있습니다. 기본 클래스를 교체할 필요가 없습니다. 기본 클래스를 확장하지만 wpdb 개체를 재정의하지 않는 사용자 지정 클래스를 작성할 수도 있습니다. 이 경우 $mycustomclass->method()
를 사용하지만 그것이 세상의 끝이 아닙니다.
기본 wpdb 클래스를 확장하는 명백한 쿨함 요소 외에도 WP에서 수행되도록 의도된 것이며 해킹이 아니므로 자유롭게 사용하십시오. 두 가지 사항을 염두에 두십시오.
- 프로젝트를 다른 사람에게 보낼 때
db.php
파일을 포함하는 것을 잊지 마십시오. 어떤 테마나 플러그인 폴더에도 없을 것입니다. - 사용자 정의 클래스에 영향을 미칠 수 있으므로
wp-db.php
의 변경 사항을 주시하십시오(가능성은 거의 없음)