2010-09-28 20 views
10

Trong cài đặt đa trang Wordpress 3.0 của chúng tôi, chúng tôi có tùy chọn tùy chỉnh cho tất cả các blog của chúng tôi được gọi là 'nền tảng'. Quản trị viên có thể nhập giá trị cho nền tảng này khi tạo hoặc chỉnh sửa blog. Một số blog có thể không có nền tảng.Làm thế nào tôi có thể đồng thời truy vấn tất cả các bảng tùy chọn blog trong một cài đặt nhiều trang Wordpress (3.0)?

Chúng tôi cần có thể tạo danh sách tất cả nền tảng và blog được liên kết của họ. Vấn đề là, chúng tôi tự động tạo và xóa blog thông qua các cơ chế trang web khác, vì vậy chúng tôi có rất nhiều bảng tùy chọn blog với các con số không nhất thiết phải tiếp giáp. (ví dụ: wp_2_options, wp_4_options, wp_12_options, v.v.)

Câu hỏi của tôi là, có cách nào trong Wordpress để chọn một tùy chọn trên tất cả các blog? Ngược lại, có một truy vấn tôi có thể chạy mà sẽ làm điều này bằng tay? Tôi đã thử một cái gì đó như thế này để không ảnh hưởng gì:

SELECT * FROM (SELECT tên_bảng TỪ information_schema.tables ĐÂU tên_bảng như 'wp _% _ tùy chọn') như t ĐÂU OPTION_NAME = 'nền tảng'

Liệu nó có ý nghĩa những gì tôi đang cố gắng làm? Một lần nữa, tôi xin lỗi vì thiếu kiến ​​thức MySql, nhưng tôi không thể tìm thấy bất kỳ câu trả lời nào về cách thực hiện điều này. Tôi cũng có thể truy vấn tất cả các tên bảng này trước, sau đó truy vấn từng bảng riêng biệt, nhưng đó không thực sự là một tùy chọn vì chúng tôi có nhiều blog và chúng tôi có thể cần phải chạy truy vấn này cho nhiều yêu cầu trang cùng một lúc và điều này sẽ thêm hàng trăm truy vấn cho từng yêu cầu này.

Bất kỳ lời khuyên hoặc giúp đỡ nào các bạn có thể đưa ra sẽ được đánh giá cao.

Trả lời

4

Nếu bạn muốn truy vấn trực tiếp cơ sở dữ liệu MySQL, bạn có thể tạo một thủ tục và sử dụng nó:

use wordpress; 
Drop Procedure IF EXISTS wordpress.MyProcedure; 
DELIMITER | ; 
CREATE PROCEDURE MyProcedure (param1 VARCHAR(30)) 
BEGIN 
     DECLARE tbname CHAR(50); 
     DECLARE endfetch INT DEFAULT 0; 
     DECLARE cur1 CURSOR FOR 
     SELECT table_name FROM information_schema.tables WHERE table_schema='wordpress' and table_name like '%options'; 
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' 
       SET endfetch = 1; 
     OPEN cur1; 
     FETCH cur1 INTO tbname; 
     fetchloop: WHILE NOT endfetch DO 
      SELECT tbname ; 
      SET @opt = param1; 
      SET @table_name = tbname; 
      SET @sql_text = concat('SELECT option_value FROM ',@table_name,' WHERE option_name=''',@opt,''''); 
      PREPARE stmt FROM @sql_text; 
      EXECUTE stmt; 
      DEALLOCATE PREPARE stmt; 

      FETCH cur1 INTO tbname; 
     END WHILE fetchloop; 
END 
| 
DELIMITER ; | 


CALL MyProcedure('siteurl'); 
7

Trong trường hợp ai quan tâm, tôi đã làm như thế này (nhưng tôi vẫn muốn biết nếu có thể thực hiện tìm kiếm trên tên bảng bằng cách sử dụng LIKE và sau đó truy vấn các bảng đó, nếu có ai biết).

// so get all the blog ids from the blogs table 
$blogs = $wpdb->get_results("SELECT blog_id FROM {$wpdb->blogs}", ARRAY_A); 

// build a sql statement for each blog options table, adding in the blog id for each row 
$select_statements = array(); 
foreach ($blogs as $blog_row) { 
    $select_statements[] = 'SELECT option_value, CAST('.$blog_row['blog_id'].' AS UNSIGNED INTEGER) AS blog_id FROM '.$wpdb->get_blog_prefix($blog_row['blog_id'])."options WHERE option_name='$option_name'"; 
} 

// cache the results of the union of all these select statements 
$option_results = $wpdb->get_results(implode(' UNION ALL ', $select_statements), ARRAY_A); 
+0

nhờ cho việc này. bạn có biết làm thế nào bạn có thể truy vấn nhiều tùy chọn? – Alex

+0

Hmmm, tôi tin rằng tất cả những gì bạn cần làm là thay đổi mệnh đề WHERE của các truy vấn bên trong của bạn. Một cái gì đó như: "... WHERE option_name = '$ option_name1' OR option_name = '$ option_name2'"; ... Bạn cũng có thể sử dụng MYSQL IN clase "... WHERE option_name IN ('$ option_name1', '$ option_name2')" Hy vọng rằng sẽ giúp! –

Các vấn đề liên quan