Sử dụng wpdb để kết nối với cơ sở dữ liệu riêng biệt


86

Tôi muốn kết nối wpdbvới cơ sở dữ liệu khác. Làm cách nào để tạo cá thể và truyền tên cơ sở dữ liệu / tên người dùng / mật khẩu?

Cảm ơn


Một cơ sở dữ liệu MySQL, hoặc một loại cơ sở dữ liệu khác? Bạn vẫn muốn truy cập vào cơ sở dữ liệu WordPress thông thường hay bạn đang chuyển trang web từ DB này sang DB khác?
EAMann

1
Vâng, một cơ sở dữ liệu MySQL khác. Đó là một DB riêng biệt trên cùng một máy chủ và nó không phải là một Wordpress. Đó là một db tùy chỉnh, với thông tin tôi muốn hiển thị bên trong wordpress.
Wadih M.

1
Nếu bạn đã làm điều đó với đối tượng $ wpdb, nếu có thể, nó sẽ ngắt kết nối phần còn lại của WordPress khỏi cơ sở dữ liệu hiện có của nó. Vì vậy, không nên. Một tùy chọn khác là tạo một phiên bản mới bằng EZQuery, được WordPress sử dụng. Tôi nghĩ EZQuery được sử dụng vì đây là lớp trừu tượng bạn khỏi phải sử dụng php-pdo-mysql, php-mysql hoặc php-mysqli, không biết có thể được cài đặt trên một máy chủ nhất định.
Volomike

3
Vâng nó có thể. wpdb có thể được khởi tạo để truy cập bất kỳ cơ sở dữ liệu nào và truy vấn bất kỳ bảng nào.
Wadih M.

Câu trả lời:


138

Vâng nó có thể.

Đối tượng wpdb có thể được sử dụng để truy cập bất kỳ cơ sở dữ liệu nào và truy vấn bất kỳ bảng nào. Tuyệt đối không cần phải liên quan đến Wordpress, điều này rất thú vị.

Lợi ích là khả năng sử dụng tất cả các lớp và chức năng của wpdb get_results, v.v. để không cần phải phát minh lại bánh xe.

Đây là cách thực hiện:

$mydb = new wpdb('username','password','database','localhost');
$rows = $mydb->get_results("select Name from my_table");
echo "<ul>";
foreach ($rows as $obj) :
   echo "<li>".$obj->Name."</li>";
endforeach;
echo "</ul>";

3
Booyah. Quá tệ tất cả những bình luận được thêm vào chính câu hỏi để chặn câu trả lời chính xác của bạn.
jerclarke

@Jeremy Clarke: Tôi đồng ý. Hy vọng đồng nghiệp wordpress của chúng tôi sẽ cẩn thận hơn để không ngây thơ lan truyền thông tin sai lệch.
Wadih M.

1
bạn cũng có thể tiết kiệm thời gian bằng cách sử dụng global $wpdb. Nhưng trước khi bắn phương thức $ wpdb-> get_results, bạn phải bao gồm wp-load.php như: require_once('/your/wordpress/wp-load.php');
Junior M

Đặt tiền tố WPDB để tạo WP_Query và get_post để tạo truy vấn sql chính xác bằng cách gọi$mydb->set_prefix('wp_');
MR

30

Kết nối với cơ sở dữ liệu thứ hai rất dễ dàng trong WordPress, bạn chỉ cần tạo một phiên bản mới của lớp WPDB và sử dụng nó giống như cách bạn sẽ sử dụng ví dụ $ wpdb tiêu chuẩn mà chúng ta đều biết và yêu thích.

Giả sử cơ sở dữ liệu thứ hai có cùng thông tin đăng nhập như WP chính, bạn thậm chí có thể sử dụng các hằng số được xác định trước từ wp-config.php để tránh mã hóa thông tin đăng nhập.

/**
 * Instantiate the wpdb class to connect to your second database, $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
 * Use the new database object just like you would use $wpdb
 */
$results = $second_db->get_results($your_query);

Điều này hơi thừa đối với câu trả lời của Wadih nhưng tôi nghĩ ví dụ mã của tôi rõ ràng hơn một chút và điều quan trọng cần nhớ là hằng số đăng nhập db vì chúng hầu như luôn luôn là quyền sử dụng và nếu không, bạn sẽ gặp rủi ro khi chuyển từ dev-> giai đoạn- > môi trường sống nơi chi tiết đăng nhập có thể thay đổi.
jerclarke

Đặt tiền tố WPDB để tạo WP_Query và get_post để tạo truy vấn sql chính xác bằng cách gọi$second_db->set_prefix('wp_');
MR

21

không ai nói điều này vì vậy tôi nghĩ tôi sẽ thêm một cách dễ dàng hơn nữa ..

miễn là cơ sở dữ liệu bổ sung của bạn có cùng chi tiết người dùng / thông qua để truy cập nó như cơ sở dữ liệu wordpress của bạn, bạn có thể sử dụng tên cơ sở dữ liệu trước tên bảng như thế này

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);

Từ kinh nghiệm của tôi, điều này chỉ hoạt động để có được dữ liệu, tức là sử dụng SELECT. Bạn không thể chèn dữ liệu.
Người bảo vệ một

nó sẽ không hoạt động bên ngoài,
Wasim A.

7

Mặc dù các tính năng này sẽ hoạt động, bạn sẽ mất khả năng sử dụng các tính năng tùy chỉnh "khác" như truy vấn get_post_custom và wordpress. Giải pháp đơn giản là

$wpdb->select('database_name');

làm thay đổi toàn bộ cơ sở dữ liệu (một mysql select_db). Phương thức database.table hoạt động nếu bạn chỉ muốn thực hiện một truy vấn đơn giản, nhưng nếu bạn muốn truy cập một blog wordpress khác, bạn có thể sử dụng select. Bạn sẽ chỉ cần thay đổi lại khi bạn hoàn thành hoặc blog của bạn có thể làm những điều kỳ lạ.


Tôi đang sử dụng giải pháp này và nó hoạt động rất tốt, ngoại trừ một điều. Vì một số lý do wp_get_post_terms()không rõ dường như không sử dụng DB mới được chọn ?? Mọi chức năng khác mà tôi đã thử (như get_post_meta(), get_posts()v.v.) dường như chỉ hoạt động tốt nhưng wp_get_post_terms()dường như hoạt động đối với DB_NAMEcơ sở dữ liệu. Có ý kiến ​​gì không?
powerbuoy

7

Tôi chưa thể bình luận, nhưng tôi muốn mở rộng câu trả lời của Wadih M. (rất hay).

Lớp cơ sở dữ liệu của WP là phiên bản tùy chỉnh của ezQuery của Justin Vincent. Nếu bạn thích giao diện và bạn muốn làm một trang web không dựa trên WordPress, bạn có thể muốn kiểm tra nó: http://justinvincent.com/ezsql


ezSQL thực sự làm tôi nản lòng, đến từ WPDB. Không có câu lệnh "chuẩn bị", không có "chèn" hoặc "cập nhật" ... Tôi muốn sử dụng toàn bộ lớp WPDB khi nó tồn tại, điều này có thể bằng cách đưa một vài tệp ra khỏi BackPress trong dự án của bạn.
Goldenapples

@gabrielk Liên kết đã chết - liên kết mới là: [1] [1]: justinvincent.com/ezsql
Hexodus

4

Tôi đã vật lộn với việc sử dụng $wpdbđể kết nối với cơ sở dữ liệu blog thứ hai từ một trang mẹ cần cập nhật hai blog. Tôi đã sử dụng $wpdb->select($dbname, $dbh)để chọn cơ sở dữ liệu thứ hai, nhưng tôi vẫn nhận được kết quả từ cơ sở dữ liệu đầu tiên.

Tôi đã giải quyết vấn đề bằng cách gọi wp_cache_flush()để xóa bộ đệm WordPress trước khi gọi các chức năng WP trên cơ sở dữ liệu thứ hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.