Как мне создать эффективный контент-фильтр для определенных постов?

Я отметил этот пост как WordPress, но я не совсем уверен, что он специфичен для WordPress, поэтому я публикую его в StackOverflow, а не в WPSE.The solution doesn't have to be WordPress-specific, simply PHP.

The Scenario
Я бегусайт по рыбному хозяйству с рядом тропических рыбSpecies Profiles а такжеGlossary записей.

Наш сайт ориентирован на наши профили. Они, как вы можете назвать, хлеб с маслом на сайте.

Я надеюсь, что в каждом профиле вида, в котором упоминается другой вид или запись глоссария, я могу заменить эти слова ссылкой - как вы увидитеВот, В идеале, я бы тоже хотел, чтобы это происходило в новостях, статьях и блогах.

У нас есть почти1400 species profiles а также1700 glossary entries, Наши профили видов часто бывают длинными и, наконец, учитывают только наши профили видовnumbered more than 1.7 million words информации.

What I'm Currently Attempting
В настоящее время у меня естьfilter.php с функцией, которая, я считаю, делает то, что мне нужно. Код довольно длинный, и его можно найти полностьюВот.

Кроме того, в моей теме WordPressfunctions.phpУ меня есть следующее:

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

Способ, который (как мы надеемся) описали в комментариях к коду, заключается в том, что каждый час WordPress выполняет задание cron (которое похоже на ложный cron) - работает при попаданиях пользователя, но это не имеет значения, поскольку время не имеет значения. ; t важно), который запускает фильтр, найденный выше.

Логическое обоснование его ежечасной работы заключалось в том, что если бы мы попытались запустить его после сохранения каждого сообщения, это нанесло бы ущерб автору. Как только мы привлекаем приглашенных авторов, это, очевидно, не приемлемый способ сделать это.

The Problem...
Уже несколько месяцев у меня возникают проблемы с надежной работой этого фильтра. Я не верю, что проблема связана с самим фильтром, но с одной из функций, которая включает фильтр, то есть заданием cron, или функцией, которая выбирает, какие посты фильтруются, или функцией, которая подготавливает списки слов и т. Д. Для фильтр.

К сожалению, диагностировать проблему довольно сложно (что я вижу), поскольку она работает в фоновом режиме и только ежечасно. Я пытался использовать WordPress.update_option функция (которая в основном записывает простое значение базы данных) для проверки ошибок, но мне не очень повезло - и, честно говоря, я совершенно запутался в том, где находится проблема.

Мы закончили работу сайта без корректной работы этого фильтра. Иногда кажется, что это работает, иногда это не так. В результате у нас теперь есть довольно много профилей видов, которые не были правильно отфильтрованы.

What I'd Like...
Я в основном ищу совет о том, как лучше всего использовать этот фильтр.

Является ли Cron Job ответом? Я могу настроить.php файл, который запускается каждый день, это не будет проблемой. Как бы он определил, какие сообщения нужно отфильтровать? Какое влияние это окажет на сервер во время его работы?

Альтернативно, является ли страница администратора WordPress ответом? Если бы я знал, как это сделать, то что-то похожее на страницу - с использованием AJAX - что позволило бы мне выбрать посты для запуска фильтра, было бы идеально. Есть плагин под названиемAJAX Regenerate Thumbnails который работает так, может быть, это будет наиболее эффективным?

Considerations

The size of the database/information being affected/read/written Which posts are filtered The impact the filter has on the server; especially considering I don't seem to be able to increase the WordPress memory limit past 32Mb. Is the actual filter itself efficient, effective and reliable?

Это довольно сложный вопрос, и я неизбежно (так как коллеги меня отвлекали примерно 18 раз в процессе) упустил некоторые детали. Пожалуйста, не стесняйтесь спрашивать меня для получения дополнительной информации.

Заранее спасибо,

Ответы на вопрос(1)

Ваш ответ на вопрос