function wp_set_option_autoload_values( array $options ) {
global $wpdb;
if ( ! $options ) {
return array();
}
$grouped_options = array(
'yes' => array(),
'no' => array(),
);
$results = array();
foreach ( $options as $option => $autoload ) {
wp_protect_special_option( $option );
if ( 'no' === $autoload || false === $autoload ) {
$grouped_options['no'][] = $option;
} else {
$grouped_options['yes'][] = $option;
}
$results[ $option ] = false;
}
$where = array();
$where_args = array();
foreach ( $grouped_options as $autoload => $options ) {
if ( ! $options ) {
continue;
}
$placeholders = implode( ',', array_fill( 0, count( $options ), '%s' ) );
$where[] = "autoload != '%s' AND option_name IN ($placeholders)";
$where_args[] = $autoload;
foreach ( $options as $option ) {
$where_args[] = $option;
}
}
$where = 'WHERE ' . implode( ' OR ', $where );
$options_to_update = $wpdb->get_col( $wpdb->prepare( "SELECT option_name FROM $wpdb->options $where", $where_args ) );
if ( ! $options_to_update ) {
return $results;
}
foreach ( $grouped_options as $autoload => $options ) {
if ( ! $options ) {
continue;
}
$options = array_intersect( $options, $options_to_update );
$grouped_options[ $autoload ] = $options;
if ( ! $grouped_options[ $autoload ] ) {
continue;
}
$success = $wpdb->query(
$wpdb->prepare(
"UPDATE $wpdb->options SET autoload = %s WHERE option_name IN (" . implode( ',', array_fill( 0, count( $grouped_options[ $autoload ] ), '%s' ) ) . ')',
array_merge(
array( $autoload ),
$grouped_options[ $autoload ]
)
)
);
if ( ! $success ) {
$grouped_options[ $autoload ] = array();
continue;
}
foreach ( $grouped_options[ $autoload ] as $option ) {
$results[ $option ] = true;
}
}
if ( $grouped_options['yes'] ) {
wp_cache_delete_multiple( $grouped_options['yes'], 'options' );
wp_cache_delete( 'alloptions', 'options' );
} elseif ( $grouped_options['no'] ) {
$alloptions = wp_load_alloptions( true );
foreach ( $grouped_options['no'] as $option ) {
if ( isset( $alloptions[ $option ] ) ) {
unset( $alloptions[ $option ] );
}
}
wp_cache_set( 'alloptions', $alloptions, 'options' );
}
return $results;
}