Исключить функцию для пользовательских страниц, исключить пользовательские поля ACF

Вопрос или проблема

У меня есть следующий код:

function auto_link_post_titles( $content ) {
    // Устанавливаем тип поста(ов), которые мы будем получать.
    $desired_post_types = array( 'my_post_type', 'my_other_post_type' );
    // Это для того, чтобы получить все опубликованные посты из всех типов постов.
    $args = array(
        'post_type'      => $desired_post_types,
        'post_status'    => 'publish',
        'posts_per_page' => -1, // это для получения всех постов
    );

    $posts = get_posts( $args );

    // Здесь мы проходим через каждый пост и заменяем заголовок в содержимом на ссылку.
    foreach ( $posts as $post ) {
        $post_title = esc_html( $post->post_title ); // Здесь мы получаем заголовок поста.
        $post_link  = esc_url( get_permalink( $post->ID ) ); // Здесь мы получаем ссылку на пост.
        
        // Создаем элемент ссылки
        $link = '<a href="' . $post_link . '" target="_blank">' . $post_title . '</a>';
        
        // Здесь мы заменяем обычный текст заголовка на ссылку.
        $content = str_replace( $post_title, $link, $content );
    }

    return $content;
}

// Мы применили функцию к содержимому постов.
add_filter( 'acf/load_value', 'auto_link_post_titles' );

Я хотел бы попросить помощи с двумя проблемами:

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

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

Спасибо!

Ответ или решение

Конечно, давайте разберем, как можно решить ваши две проблемы касательно функции auto_link_post_titles.

1. Исключение функции для определенных страниц

Чтобы исключить функцию для определенных страниц, вы можете использовать условные теги WordPress в вашем коде. Например, если вы хотите исключить эту функцию для страниц с определенными идентификаторами или с определенным числом (slug), вы можете сделать это следующим образом:

function auto_link_post_titles( $content ) {
    // Проверяем, не находимся ли мы на странице, которую нужно исключить
    if ( is_page( array( 'slug-страницы-или-id', 45 ) ) ) {
        return $content; // Если это страница, которую нужно исключить, возвращаем оригинальный контент
    }

    // Здесь основной код вашей функции
    $desired_post_types = array( 'my_post_type', 'my_other_post_type' );
    $args = array(
        'post_type'      => $desired_post_types,
        'post_status'    => 'publish',
        'posts_per_page' => -1,
    );

    $posts = get_posts( $args );

    foreach ( $posts as $post ) {
        $post_title = esc_html( $post->post_title ); 
        $post_link  = esc_url( get_permalink( $post->ID ) ); 
        $link = '<a href="' . $post_link . '" target="_blank">' . $post_title . '</a>'; 
        $content = str_replace( $post_title, $link, $content );
    }

    return $content;
}

add_filter( 'the_content', 'auto_link_post_titles' );

2. Исключение функции для определенных полей ACF

Теперь давайте добавим условие для исключения этой функции для специфических полей ACF. Вы можете использовать get_field() и get_post_meta() для проверки, к какому полю применяется функция:

function auto_link_post_titles( $content ) {
    // Проверяем, не находимся ли мы на странице, которую нужно исключить
    if ( is_page( array( 'slug-страницы-или-id', 45 ) ) ) {
        return $content;
    }

    // Проверяем, нужно ли нам исключить функцию для конкретных полей ACF
    if ( in_array( get_field( 'ваше_поле' ), array( 'исключение_1', 'исключение_2' ) ) ) {
        return $content; // Если это поле, которое нужно исключить
    }

    // Здесь основной код вашей функции
    $desired_post_types = array( 'my_post_type', 'my_other_post_type' );
    $args = array(
        'post_type'      => $desired_post_types,
        'post_status'    => 'publish',
        'posts_per_page' => -1,
    );

    $posts = get_posts( $args );

    foreach ( $posts as $post ) {
        $post_title = esc_html( $post->post_title ); 
        $post_link  = esc_url( get_permalink( $post->ID ) ); 
        $link = '<a href="' . $post_link . '" target="_blank">' . $post_title . '</a>'; 
        $content = str_replace( $post_title, $link, $content );
    }

    return $content;
}

add_filter( 'acf/load_value', 'auto_link_post_titles' );

В этом коде get_field( 'ваше_поле' ) должен быть заменен на название того поля ACF, для которого вы хотите исключить автоматическую ссылку. Замените 'исключение_1' и 'исключение_2' на значения, которые будут указывать на поля, для которых вы не хотите, чтобы возникали автоматические ссылки.

Таким образом, вы сможете контролировать, на каких страницах и для каких полей ACF будет применяться ваша функция. Если у вас есть дополнительные вопросы или нужна помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...