¿Cómo hago para crear un filtro de contenido eficiente para ciertas publicaciones?

He etiquetado esta publicación como WordPress, pero no estoy completamente seguro de que sea específico de WordPress, por lo que lo estoy publicando en StackOverflow en lugar de WPSE.La solución no tiene que ser específica de WordPress, simplemente PHP.

El escenario
Yo corro unsitio de pesca con una cantidad de peces tropicalesSpecies Profiles yGlossary entradas.

Nuestro sitio web está orientado en torno a nuestros perfiles. Son, como puede llamarse, el pan y la mantequilla del sitio web.

Lo que espero lograr es que, en cada perfil de especie que menciona otra especie o una entrada de glosario, pueda reemplazar esas palabras con un enlace, como veráaquí. Idealmente, también me gustaría que esto ocurriera también en noticias, artículos y publicaciones de blogs.

Tenemos casi1400 species profiles y1700 glossary entries. Nuestros perfiles de especies son a menudo largos y, por último, cuentan solo nuestros perfiles de especies.numbered more than 1.7 million words de información.

Lo que estoy intentando actualmente
Actualmente tengo unfilter.php con una función que, creo, hace lo que necesito que haga. El código es bastante largo y se puede encontrar en su totalidad.aquí.

Además, en mi tema de WordPressfunctions.php, Tengo los siguientes:

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

La forma en que funciona, como lo describen (con suerte) los comentarios del código, es que cada hora WordPress opera un trabajo de cron (que es como un cron falso; funciona con los golpes de los usuarios, pero eso no importa ya que la sincronización no es importante) que ejecuta el filtro encontrado arriba.

El razonamiento detrás de su ejecución por hora era que si intentábamos ejecutarlo cuando se guardaba cada publicación, sería en detrimento del autor. Una vez que involucramos a autores invitados, obviamente no es una forma aceptable de hacerlo.

El problema...
Hace meses que tengo problemas para que este filtro funcione de manera confiable. No creo que el problema radique en el filtro en sí, sino en una de las funciones que habilita el filtro, es decir, el trabajo cron, o la función que elige qué publicaciones se filtran, o la función que prepara las listas de palabras, etc. el filtro.

Desafortunadamente, diagnosticar el problema es bastante difícil (que puedo ver), gracias a que se ejecuta en segundo plano y solo por hora. He estado tratando de usar WordPress 'update_option Función (que básicamente escribe un valor de base de datos simple) para la comprobación de errores, pero no he tenido mucha suerte, y para ser sincero, estoy bastante confundido en cuanto a dónde está el problema.

Terminamos poniendo el sitio web en vivo sin que este filtro funcionara correctamente. A veces parece funcionar, otras no. Como resultado, ahora tenemos bastantes perfiles de especies que no se filtran correctamente.

Lo que me gustaria
Básicamente estoy buscando consejos sobre la mejor manera de ejecutar este filtro.

¿Es un trabajo Cron la respuesta? Puedo configurar un.php Archivo que se ejecuta todos los días, eso no sería un problema. ¿Cómo determinaría qué publicaciones necesitan ser filtradas? ¿Qué impacto tendría en el servidor en el momento en que se ejecutó?

Alternativamente, ¿es la página de administración de WordPress la respuesta? Si supiera cómo hacerlo, algo como las líneas de una página, utilizando AJAX, que me permitió seleccionar las publicaciones para ejecutar el filtro sería perfecto. Hay un plugin llamadoAJAX Regenerate Thumbnails que funciona así, tal vez sea el más efectivo?

Consideraciones

El tamaño de la base de datos / información que está siendo afectada / leída / escritaQue mensajes son filtradosEl impacto que el filtro tiene en el servidor; especialmente teniendo en cuenta que parece que no puedo aumentar el límite de memoria de WordPress más allá de los 32Mb.¿Es el filtro real en sí eficiente, efectivo y confiable?

Esta es una pregunta bastante compleja e inevitablemente (ya que me distrajé aproximadamente 18 veces por mis colegas en el proceso) omití algunos detalles. Por favor, siéntase libre de indagarme para más información.

Gracias por adelantado,

Respuestas a la pregunta(1)

Su respuesta a la pregunta