Jetpack działa lokalnie [zamknięty]

16

Zastanawiałem się, czy ktoś wiedział, jak to łatwo rozwiązać.

Kod mojej lokalnej wersji deweloperskiej instancji WordPress i wersji na żywo są zsynchronizowane (tak jak powinny). Problem polega na tym, że wtyczka „Jetpack” działa w wersji na żywo (ponieważ jest to blog na żywo, który może połączyć się z WordPress.com), ale nie w lokalnej wersji deweloperskiej.

Oznacza to, że funkcjonalność jest dostępna w wersji na żywo (jak widżet paska bocznego „Subskrybuj”), ale nie w lokalnej wersji deweloperskiej, dlatego nie są zsynchronizowane.

AlecRust
źródło

Odpowiedzi:

24

Od wersji JetPack 2.2.1 dostępny jest teraz tryb programowania lokalnego / debugowania. http://jetpack.me/2013/03/28/jetpack-dev-mode-release/

posługiwać się:

define ('JETPACK_DEV_DEBUG', true);

w swojej wp-config i powinieneś mieć dostęp do wszystkich modułów, które nie wymagają połączenia do działania.

Zaktualizuj, ponieważ około 3.3 wprowadzono kolejny lokalny wyzwalacz rozwoju przez filtr zamiast definicji.

Najnowsze jest teraz tutaj: http://jetpack.me/support/development-mode/

Tryb programowania automatycznie włącza się, jeśli nie masz kropki w nazwie hosta witryny, tj. Localhost. Jeśli użyjesz innego adresu URL, takiego jak mycooltestsite.local lub coś takiego, musisz zdefiniować stałą JETPACK_DEV_DEBUG.

Możesz także włączyć tryb programowania Jetpack poprzez wtyczkę, dzięki filtrowi jetpack_development_mode:

add_filter( 'jetpack_development_mode', '__return_true' );

Począwszy od wersji Jetpack v3.9 dostępny jest teraz także filtr trybu przemieszczania, który wymusza ponowne rozpoznanie witryny jako strony przejściowej zamiast produkcyjnej: https://developer.jetpack.com/hooks/jetpack_is_staging_site/

add_filter( 'jetpack_is_staging_site', '__return_true' );
jb510
źródło
2
Tryb Dev / Debug szuka nagłówka Requires Connectionw plikach modułów ( jetpack/modules/*.php). W ten sposób możemy sprawdzić, które będą działać w trybie deweloperskim, czy nie.
brasofilo
Lista funkcji, które nadal działają, gdy tryb programowania jest włączony na localhost: wpperform.com/jetpack-development-mode
Casey Plummer
9

Metoda podana w linku podanym przez @TracyRotton wydaje się nie działać od Jetpack 2.0 i WordPress 3.4.2.

Nawet replikacja wszystkich pól bazy danych nie działa jako połączona.
baza danych jetpack


Ponieważ pytanie PO dotyczy synchronizacji środowiska programistycznego i produkcyjnego, być może nie jest to możliwe.

Nie przetestowałem dogłębnie, które moduły działają, a które nie, ale Jetpack można oszukać, że jest podłączony, wprowadzając następującą modyfikację w pliku /plugins/jetpack/jetpack.php.

Wewnątrz klasy Jetpack_Datazmodyfikuj pierwszą funkcję, get_access_tokentaką jak:

class Jetpack_Data {    
    function get_access_token( $user_id = false ) {
        return 'USER_TOKENS-VALUE-FOUND-INSIDE-THE-OPTION-JETPACK_OPTIONS'; // <---trick
        if ( $user_id ) {
            if ( !$tokens = Jetpack::get_option( 'user_tokens' ) ) {
                return false;
            }

Lub po prostu wstaw return true;zamiast tego, user_tokensktóry możemy skopiować z wnętrza opcji jetpack_options.

PS: pierwsza wersja tej odpowiedzi używała innej sztuczki. Tutaj jest to jednowierszowa modyfikacja, która chwyta wszystko, teoretycznie ...

brasofilo
źródło
Konieczne może być także zhakowanie poszczególnych modułów, na przykład force_user_connection()metody w publicize/publicize-jetpack.php. Mimo to wydaje się, że nadal nie zachowuje się dokładnie tak, jakby był faktycznie podłączony. Nie przekopałem się zbytnio w kodzie, ale podejrzewam, że jest o wiele więcej miejsc w kodzie, które muszą zostać zhakowane, aby naprawdę działały dokładnie tak samo, jak na serwerze na żywo.
Ian Dunn
1
@IanDunn, zgodziłem się, moja odpowiedź brzmi bardziej: „nie wkurzaj mnie o bycie połączonym i pozwól mi przetestować kilka haczyków” i tak naprawdę nie dotyczy problemu OP posiadania synchronizowanych wersji deweloperskich i wdrożonych.
brasofilo
@IanDunn, znalazł inny sposób, może bardziej skuteczny. Zaktualizowałem odpowiedź, co myślisz?
brasofilo
Próbowałem wczoraj czegoś podobnego do tego, ale nadal nie mogłem odtworzyć problemu, który widziałem na moim serwerze pomostowym, więc nie jestem pewien, czy działa całkowicie, czy nie. Problem okazał się błędem w innej wtyczce i został już naprawiony, więc nie muszę już hakować Jetpack.
Ian Dunn
7

Można oszukać JetPack, kopiując wartości pól bazy danych z aktywowanej instalacji do instalacji lokalnej.

W przypadku instalacji (zdalnej) z podłączonym JetPack wyszukaj w wp_optionstabeli option_namepola zaczynające się od jetpack_, takie jak:

  • jetpack_activated
  • jetpack_options
  • jetpack_nonce_{random_string}
  • jetpack_active_modules

Skopiuj te pola i wartości do lokalnej bazy danych instalacji.

Aby uzyskać więcej informacji na temat tego procesu, patrz: http://www.ravendevelopers.com/node/57

Tracy Rotton
źródło
Dzięki za link. Dostaję błąd MySQL „# 1062 - Zduplikowany wpis„ jetpack_activated ”dla klucza„
nazwa_opcji
4

Zainspirowany najnowszym rozwiązaniem brasofilo istnieje jeszcze prostszy sposób - wystarczy otworzyć jetpack.php i wyszukać

/**
* Is Jetpack active?
*/
public static function is_active() {
    return (bool) Jetpack_Data::get_access_token( JETPACK_MASTER_USER );
}

i zamień na:

/**
* Is Jetpack active?
*/
public static function is_active() {
    return true;
}

Wydaje się być o wiele łatwiejsze niż granie z bazą danych i działało dla mnie w wersji Jetpack 2.1.1i WordPress3.5

Ale powinieneś ustawić regułę ignorowania dla tego pliku lub coś podobnego, jeśli chcesz, aby wtyczka działała dobrze na stronie na żywo, ponieważ lepiej jest podłączyć się w sposób rzeczywisty niż na stałe zakodować aktywną flagę.

GabLeRoux
źródło
3

Jeśli chcesz mieć pełną funkcjonalność Jetpack, twoje środowisko programistyczne będzie musiało być dostępne publicznie. Możesz to skonfigurować, ustawiając adres dewelopera w subdomenę, np. Sandbox.mysite.com, ustawiając ten rekord DNS tak, aby wskazywał adres IP, na którym znajduje się serwer programisty, i ewentualnie konfigurując router / zaporę ogniową, aby zezwalał na żądania portu 80 przez do twojej maszyny.

Inną opcją jest uruchomienie środowiska pomostowego i użycie go do wszystkiego, co dotyczy Jetpack. Środowiska przejściowe mają wiele zalet, więc i tak warto je skonfigurować.

Matthew Boynes
źródło
2

jetpack_development_modeFiltr:

Chcę tylko wspomnieć o jetpack_development_modefiltrze.

Możesz po prostu użyć:

add_filter( 'jetpack_development_mode', '__return_true' );

aby uruchomić JetPack lokalnie.

Mała wtyczka:

Aby uniknąć konieczności modyfikowania wp-config.phppliku zwykłą sztuczką:

define ('JETPACK_DEV_DEBUG', true);

możesz teraz kontrolować to za pomocą tej małej wtyczki:

<?php
/**
 * Plugin Name: Run JetPack locally
 * Plugin URI:  http://wordpress.stackexchange.com/a/144317/26350
 * Version:     0.0.1
 */
add_filter( 'jetpack_development_mode', '__return_true' );

Możesz to sprawdzić na GitHub .

birgire
źródło
-1

Poprawka na http://ravendevelopers.com/node/57 MOŻE nie działać z wersjami Jetpack powyżej 2.x. Jeśli to nie działa w wersji 2.x, spróbuj najpierw zainstalować Jetpack na swojej stronie internetowej, np. (Example.com), podłącz go do wordpress.com, a następnie zaimportuj ustawienia z witryny na żywo do lokalnego hosta / przykładu, który musi być to samo (ustawienia zaimportowane z example.com mogą nie działać z localhost / example2). Rzeczą jest to, co robisz w swojej działającej witrynie. Upewnij się, że zaimportowane ustawienia dotyczą tej samej witryny na komputerze lokalnym.

anithegregorian
źródło
-2

Hmm, wygląda na to, że twoją odpowiedź można uprościć. Zaakceptuj tę zmianę, a ja podniosę głos twojej odpowiedzi.

Ponieważ is_active () zwraca true, wystarczy zmienić tylko jeden wiersz w admin_page ():

1.zmień wartość $is_user_connectednatrue

function admin_page() {
    global $current_user;

    $role = $this->translate_current_user_to_role();
    $is_connected = Jetpack::is_active();
    $user_token = Jetpack_Data::get_access_token($current_user->ID);
    $is_user_connected = true;//$user_token && !is_wp_error($user_token);
    // ...function continues
Matt Senate
źródło
Cześć Matt, rozumiem, że to komentarz do mojej odpowiedzi. W is_activeJetPack są 2 funkcje, dlatego rozwiązanie wydaje się zbędne, ale tak nie jest :)
brasofilo
Hmm, spojrzę. Myślałem, że znalazłem tylko jedną metodę is_active, która była w klasie Jetpack, ale sprawdzi ponownie.
Matt Senate