Как Исключить из поиска BasePress некоторые записи, через скрытие чекбоксом в админке статьи?

Добавляем чекбокс “Исключить из поиска BasePress” в правую панель при редактировании статьи
И исключаем записи плагина BasePress из поиска по базе.

Пример из админки:

Скопируйте этот код в файл functions.php вашей активной темы



/**
 * 1. Добавляем чекбокс "Исключить из поиска BasePress" в правую панель при редактировании статьи
 */
add_action( 'add_meta_boxes', 'add_basepress_exclude_metabox' );
function add_basepress_exclude_metabox() {
    // Замените 'knowledgebase' на ваш тип записи BasePress, если он отличается
    add_meta_box(
        'basepress_exclude_search_box',
        'Поиск BasePress',
        'render_basepress_exclude_metabox',
        'knowledgebase', // Тип записи статей в BasePress
        'side',         // Расположение: справа (side)
        'default'       // Приоритет
    );
}

/**
 * 2. Отрисовываем сам чекбокс
 */
function render_basepress_exclude_metabox( $post ) {
    // Добавляем поле безопасности (nonce)
    wp_nonce_field( 'save_basepress_exclude', 'basepress_exclude_nonce' );
    
    // Получаем текущее состояние галочки
    $is_excluded = get_post_meta( $post->ID, '_basepress_exclude_from_search', true );
    ?>
    <label for="basepress_exclude_checkbox" style="display:flex; align-items:center; gap:8px; cursor:pointer;">
        <input type="checkbox" 
               id="basepress_exclude_checkbox" 
               name="basepress_exclude_from_search" 
               value="1" 
               <?php checked( $is_excluded, '1' ); ?> 
        />
        Исключить из внутреннего поиска BasePress
    </label>
    <p style="color: #666; font-size: 12px; margin-top: 5px;">
        Статья останется доступной по прямой ссылке, но не будет находиться через поиск на сайте.
    </p>
    <?php
}

/**
 * 3. Сохраняем состояние галочки при обновлении статьи
 */
add_action( 'save_post_knowledgebase', 'save_basepress_exclude_metabox' );
function save_basepress_exclude_metabox( $post_id ) {
    // Проверка безопасности и прав доступа
    if ( ! isset( $_POST['basepress_exclude_nonce'] ) || 
         ! wp_verify_nonce( $_POST['basepress_exclude_nonce'], 'save_basepress_exclude' ) ) {
        return;
    }
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if ( ! current_user_can( 'edit_post', $post_id ) ) return;

    // Сохраняем или удаляем мета-значение
    if ( isset( $_POST['basepress_exclude_from_search'] ) && $_POST['basepress_exclude_from_search'] == '1' ) {
        update_post_meta( $post_id, '_basepress_exclude_from_search', '1' );
    } else {
        delete_post_meta( $post_id, '_basepress_exclude_from_search' );
    }
}

/**
 * 4. Модифицируем сам поиск BasePress, подтягивая ID статей с установленной галочкой
 */
add_filter( 'basepress_search_query_pieces', 'exclude_articles_from_basepress_search', 10, 2 );
function exclude_articles_from_basepress_search( $pieces, $terms ) {
    global $wpdb;
    
    if ( ! isset( $pieces['where'] ) ) return $pieces;
    
    // Находим в базе ВСЕ ID статей, у которых стоит галочка
    $excluded_ids = $wpdb->get_col("
        SELECT post_id 
        FROM {$wpdb->postmeta} 
        WHERE meta_key = '_basepress_exclude_from_search' 
        AND meta_value = '1'
    ");
    
    if ( ! empty( $excluded_ids ) ) {
        $ids_string = implode( ',', array_map( 'intval', $excluded_ids ) );
        $pieces['where'] .= " AND {$wpdb->posts}.ID NOT IN ({$ids_string})";
    }
    
    return $pieces;
}

guest
Другие сообщения форума
Закрыть меню