Como faço para criar um filtro de conteúdo eficiente para determinadas postagens?

Eu marquei este post como WordPress, mas não tenho certeza se ele é específico do WordPress, então estou postando no StackOverflow em vez de no WPSE.A solução não precisa ser específica do WordPress, simplesmente PHP.

O cenário
Eu corro umsite de aquariofilia com um número de peixes tropicaisSpecies Profiles eGlossary entradas.

Nosso site é orientado em torno de nossos perfis. Eles são, como você pode dizer, o pão e a manteiga do site.

O que eu espero conseguir é que, em cada perfil de espécie que menciona outra espécie ou uma entrada de glossário, eu possa substituir essas palavras por um link - como você veráAqui. Idealmente, eu também gostaria que isso ocorresse em notícias, artigos e posts do blog também.

Nós temos quase1400 species profiles e1700 glossary entries. Os nossos perfis de espécies são frequentemente longos e, finalmente, contam apenas os perfis das nossas espéciesnumbered more than 1.7 million words de informação.

O que estou atualmente tentando
Atualmente, tenho umfilter.php com uma função que - acredito - faz o que eu preciso fazer. O código é bastante longo e pode ser encontrado na íntegraAqui.

Além disso, no meu tema WordPressfunctions.phpEu tenho o seguinte:

# ==============================================================================================
# [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' ) );
    }

A maneira como isso funciona, como (espero) descrito pelos comentários do código, é que a cada hora que o WordPress opera um cron job (que é como um falso cron - funciona com acessos do usuário, mas isso não importa, pois o tempo não é importante) que executa o filtro encontrado acima.

A lógica por trás de executá-lo de hora a hora era que, se tentássemos executá-lo quando cada post fosse salvo, seria em detrimento do autor. Uma vez que recebemos autores convidados, isso obviamente não é uma maneira aceitável de lidar com isso.

O problema...
Por meses eu tenho tido problemas em fazer esse filtro funcionar de forma confiável. Eu não acredito que o problema esteja no filtro em si, mas com uma das funções que habilita o filtro - ou seja, o cron job, ou a função que escolhe quais posts são filtrados, ou a função que prepara as listas de palavras, etc. o filtro.

Infelizmente, o diagnóstico do problema é bastante difícil (que eu posso ver), graças a ele rodando em segundo plano e apenas a cada hora. Eu tenho tentado usar o WordPress 'update_option função (que basicamente escreve um valor de banco de dados simples) para verificação de erro, mas eu não tive muita sorte - e para ser honesto, estou bastante confuso sobre onde está o problema.

Acabamos colocando o site ao vivo sem que esse filtro funcionasse corretamente. Às vezes parece funcionar, outras vezes não. Como resultado, agora temos alguns perfis de espécies que não são corretamente filtrados.

O que eu gostaria ...
Basicamente, estou procurando conselhos sobre a melhor maneira de executar esse filtro.

O Cron Job é a resposta? Posso configurar um.php arquivo que roda todos os dias, isso não seria um problema. Como determinaria quais postagens precisam ser filtradas? Qual impacto teria no servidor no momento em que foi executado?

Alternativamente, uma página de administração do WordPress é a resposta? Se eu soubesse como fazer isso, algo nos moldes de uma página - utilizando AJAX - que me permitisse selecionar as postagens para executar o filtro seria perfeito. Existe um plugin chamadoAJAX Regenerate Thumbnails que funciona assim, talvez isso seja o mais eficaz?

Considerações

O tamanho do banco de dados / informações afetadas / lidas / escritasQuais postagens são filtradasO impacto que o filtro tem no servidor; especialmente considerando que eu não consigo aumentar o limite de memória do WordPress além de 32Mb.O próprio filtro é eficiente, eficaz e confiável?

Esta é uma questão bastante complexa e eu inevitavelmente (como eu estava distraído cerca de 18 vezes por colegas no processo) deixei de fora alguns detalhes. Por favor, sinta-se livre para me investigar para mais informações.

Desde já, obrigado,

questionAnswers(1)

yourAnswerToTheQuestion