Jak mogę stworzyć wydajny filtr treści dla niektórych postów?

Oznaczyłem ten post jako WordPress, ale nie jestem do końca pewien, czy jest on specyficzny dla WordPressa, więc publikuję go na StackOverflow, a nie na WPSE.Rozwiązanie nie musi być specyficzne dla WordPressa, po prostu PHP.

Scenariusz
Biegamstrona internetowa fishkeeping z wieloma tropikalnymi rybamiSpecies Profiles iGlossary wpisy.

Nasza strona internetowa jest ukierunkowana na nasze profile. Są, jak można to nazwać, chlebem i masłem strony internetowej.

Mam nadzieję osiągnąć to, że na każdym profilu gatunku, który wymienia inny gatunek lub wpis słownika, mogę zastąpić te słowa linkiem - takim jak zobaczysztutaj. W idealnej sytuacji chciałbym również, aby pojawiło się to również w wiadomościach, artykułach i wpisach na blogu.

Mamy prawie1400 species profiles i1700 glossary entries. Nasze profile gatunkowe są często długie i w końcu liczą tylko nasze profile gatunkównumbered more than 1.7 million words informacji.

Co aktualnie próbuję
Obecnie mamfilter.php z funkcją, która - wierzę - robi to, czego potrzebuję. Kod jest dość długi i można go znaleźć w całościtutaj.

Dodatkowo w moim temacie WordPressfunctions.php, Mam co następuje:

# ==============================================================================================
# [Filter]
#
# Every hour, using WP_Cron, `my_updated_posts` is checked. If there are new Post IDs in there,
# it will run a filter on all of the post's content. The filter will search for Glossary terms
# and scientific species names. If found, it will replace those names with links including a 
# pop-up.

    include "filter.php";

# ==============================================================================================
# When saving a post (new or edited), check to make sure it isn't a revision then add its ID
# to `my_updated_posts`.

    add_action( 'save_post', 'my_set_content_filter' );
    function my_set_content_filter( $post_id ) {
        if ( !wp_is_post_revision( $post_id ) ) {

            $post_type = get_post_type( $post_id );

            if ( $post_type == "species" || ( $post_type == "post" && in_category( "articles", $post_id ) ) || ( $post_type == "post" && in_category( "blogs", $post_id ) ) ) {
                //get the previous value
                $ids = get_option( 'my_updated_posts' );

                //add new value if necessary
                if( !in_array( $post_id, $ids ) ) {
                    $ids[] = $post_id;
                    update_option( 'my_updated_posts', $ids );
                }
            }
        }
    }

# ==============================================================================================
# Add the filter to WP_Cron.

    add_action( 'my_filter_posts_content', 'my_filter_content' );
    if( !wp_next_scheduled( 'my_filter_posts_content' ) ) {
        wp_schedule_event( time(), 'hourly', 'my_filter_posts_content' );
    }

# ==============================================================================================
# Run the filter.

    function my_filter_content() {
        //check to see if posts need to be parsed
        if ( !get_option( 'my_updated_posts' ) )
            return false;

        //parse posts
        $ids = get_option( 'my_updated_posts' );

        update_option( 'error_check', $ids );

        foreach( $ids as $v ) {
            if ( get_post_status( $v ) == 'publish' )
                run_filter( $v );

            update_option( 'error_check', "filter has run at least once" );
        }

        //make sure no values have been added while loop was running
        $id_recheck = get_option( 'my_updated_posts' );
        my_close_out_filter( $ids, $id_recheck );

        //once all options, including any added during the running of what could be a long cronjob are done, remove the value and close out
        delete_option( 'my_updated_posts' );
        update_option( 'error_check', 'working m8' );
        return true;
    }

# ==============================================================================================
# A "difference" function to make sure no new posts have been added to `my_updated_posts` whilst
# the potentially time-consuming filter was running.

    function my_close_out_filter( $beginning_array, $end_array ) {
        $diff = array_diff( $beginning_array, $end_array );
        if( !empty ( $diff ) ) {
            foreach( $diff as $v ) {
                run_filter( $v );
            }
        }
        my_close_out_filter( $end_array, get_option( 'my_updated_posts' ) );
    }

Sposób, w jaki to działa, (miejmy nadzieję) opisany w komentarzach do kodu, polega na tym, że co godzinę WordPress obsługuje zadanie crona (które jest jak fałszywy cron - działa na trafieniach użytkownika, ale to nie ma znaczenia, ponieważ czas nie jest ważne), który uruchamia filtr znaleziony powyżej.

Uzasadnieniem uruchomienia go co godzinę było to, że gdybyśmy próbowali go uruchomić, gdy każdy post został zapisany, byłoby to szkodliwe dla autora. Gdy tylko zaangażujemy autorów zaproszeń, nie jest to oczywiście akceptowalny sposób postępowania.

Problem...
Od miesięcy mam problemy z niezawodnym działaniem tego filtra. Nie wierzę, że problem leży w samym filtrze, ale w jednej z funkcji, która włącza filtr - tj. W zadaniu cron lub funkcji, która wybiera, które posty są filtrowane, lub funkcji, która przygotowuje listy słów itp. Dla filtr.

Niestety zdiagnozowanie problemu jest dość trudne (widzę to), dzięki temu działa w tle i tylko co godzinę. Próbowałem użyć WordPressaupdate_option funkcja (która zasadniczo zapisuje prostą wartość bazy danych) do sprawdzania błędów, ale nie miałem wiele szczęścia - i szczerze mówiąc, jestem dość zdezorientowany, gdzie leży problem.

Skończyło się na umieszczeniu strony internetowej na żywo bez poprawnego działania tego filtra. Czasami wydaje się działać, czasami nie. W rezultacie mamy teraz kilka profili gatunków, które nie są poprawnie filtrowane.

Co bym chciał ...
Po prostu szukam porady na temat najlepszego sposobu działania tego filtru.

Czy Cron Job jest odpowiedzią? Mogę skonfigurować.php plik, który działa codziennie, to nie byłby problem. Jak określiłby, które posty należy filtrować? Jaki wpływ miałoby to na serwer w momencie jego uruchomienia?

Alternatywnie, czy strona administracyjna WordPress jest odpowiedzią? Gdybym wiedział, jak to zrobić, coś na wzór strony - z wykorzystaniem AJAX - co pozwoliło mi wybrać posty do uruchomienia filtra byłoby idealne. Nazywa się wtyczkaAJAX Regenerate Thumbnails który działa w ten sposób, może to byłoby najbardziej skuteczne?

Rozważania

Rozmiar bazy danych / informacji, na które ma wpływ / odczyt / zapisKtóre posty są filtrowaneWpływ filtra na serwer; zwłaszcza biorąc pod uwagę, że nie jestem w stanie zwiększyć limitu pamięci WordPress po 32 MB.Czy sam filtr jest wydajny, skuteczny i niezawodny?

Jest to dość złożone pytanie i nieuchronnie (ponieważ byłem rozproszony około 18 razy przez kolegów w procesie) pominęłem kilka szczegółów. Prosimy o kontakt ze mną w celu uzyskania dalszych informacji.

Z góry dziękuję,

questionAnswers(1)

yourAnswerToTheQuestion