Wsparcie » Zaawansowane » Hyperdb + WPMU

  • Rozwiązany Gronix

    (@gronix)


    Cześć! Mam domenę z WPMU, gdzie uruchomiłem hyperdb, aby dzielił mi tabele blogów na różne bazy danych. Mam problem z konfiguracją Hyperdb, a mianowicie z fragmentem:

    $wpdb->add_callback('my_db_callback');
    function my_db_callback($query, $wpdb) {
    	// Multisite blog tables are "{$base_prefix}{$blog_id}_*"
    	if ( preg_match("/^{$wpdb->base_prefix}\d+_/i", $wpdb->table) )
    		return 'blog';
    }

    Dla WPMU wyglądałoby to tak

    $wpdb->add_callback('my_db_callback');
    function my_db_callback($query, $wpdb) {
    	// Multisite blog tables are "{$base_prefix}{$blog_id}_*"
    	if ( preg_match("{$base_prefix}{$blog_id}_*", $wpdb->table) )
    		return 'blog';
    }

    To jednak nie działa. Próbowałem wielu różnych kombinacji, nic nie pomogło, więc ostatecznie liczę na Wasze wsparcie 🙂

Viewing 5 replies - 1 through 5 (of 5 total)
  • A co dokładnie chcesz zrobić?
    Jakie masz konkretnie tabele i które z nich chcesz przekierować?

    Bo pierwszy kod kieruje wszystkie „dodatkowe” tabele MU na bazę blog ….czyli tabele w formacie prefix_liczba_tabela np. wp_4_posts itp.

    Zaś poprawiony (a raczej popsuty) kod nie wiadomo co ma właściwie robić.
    W dodatku chyba nie wiesz jak funkcjonują regexpy, bo konstrukcja wyrażenia jest całkowicie skopana.

    Cześć!

    Moim celem było to, aby w jednej bazie mieć tabele „główne” tworzące sieć, a w drugiej bazie tabele tworzące poszczególne blogi. Udało już mi się i działa bardzo dobrze 🙂
    Mój kod wygląda tak:

    $wpdb->add_callback('my_db_callback');
    function my_db_callback($query, $wpdb) {
    global $blog_id;
    	// Multisite blog tables are "{$base_prefix}{$blog_id}_*"
    if ( preg_match("/^{$wpdb->base_prefix}{$blog_id}_*/i", $wpdb->table) )
    if ($blog_id%2 > 0){ return 'blog1'; } else { return 'blog2'; }
    }
    

    Trochę przekombinowane.
    Wystarczy prosta korekta domyślnego kodu.
    -podstawowe tabele blog2, tabele podstron blog1:

    $wpdb->add_callback('my_db_callback');
    function my_db_callback($query, $wpdb) {
    	// Multisite blog tables are "{$base_prefix}{$blog_id}_*"
    	if ( preg_match("/^{$wpdb->base_prefix}\d+_/i", $wpdb->table) )
    		return 'blog1';
    	return 'blog2';
    }

    Nie tak działa HyperDB. Tabele globalne WPMU nie deklarujesz już w funkcji my_db_callback.

    Globalna baza jest oddzielnie deklarowana, np.

    $wpdb->add_database(array(
    'host'     => 'localhost',
    'user'     => 'XXXXXX',
    'password' => 'XXXXXX',
    'name'     => 'XXXXXX',
    'dataset'  => 'global',
    ));
    

    A kod który wcześniej podałem z funkcją modulo sprawia, że tabele dla blogów przechowujemy w 2 różnych bazach danych. Tabele globalne są w oddzielnej bazie. Zatem w tamtym przykładzie używam w sumie 3 bazy danych MySQL.

    Ostatnio rozgryzłem to właśnie, by w moich serwisach podzielić tabele blogów nawet na 50 baz danych. Funkcja modulo w tym bardzo pomaga.

    Dawno nie korzystałem z Hyper ….faktycznie baza główna leci na defaulcie i nie potrzeba jej dodatkowo wywoływać, callbackiem wystarczy wyjątki od reguły.
    Natomiast gdy pytałem o strukturę i jak chcesz dzielić, to nic nie wspominałeś, że chcesz na więcej baz. Napisałeś tylko, że w jednej główne, a w drugiej blogi ….czyli tylko 2 bazy. Tym się zasugerowałem. Więc mój przykład powinien dla tamtego scenariusza i tak zadziałać, ba, nawet prościej, bo bez tego ostatniego returna – zakładając że to była by baza główna. Całość była by podzielona dokładnie miedzy 2 bazy.

    Jeżeli jednak chcesz dzielić na więcej baz, to jak najbardziej możesz sobie to robić korzystając z dowolnej metody, nawet z dzielenia modulo.

Viewing 5 replies - 1 through 5 (of 5 total)
  • You must be logged in to reply to this topic.