>'Madre de Dios','Moquegua'=>'Moquegua','Pasco'=>'Pasco','Piura'=>'Piura','Puno'=>'Puno','Tacna'=>'Tacna','Tumbes'=>'Tumbes','Ucayali'=>'Ucayali','Abra'=>'Abra','Agusan del Norte'=>'Agusan del Norte','Agusan del Sur'=>'Agusan del Sur','Aklan'=>'Aklan','Huíla'=>'Huíla','Municipalidad Metropolitana de Lima'=>'Stadtverwaltung von Lima','Manawatu-Whanganui'=>'Manawatū-Whanganui','Venezia'=>'Venedig','Sherpur'=>'Sherpur','Sirajganj'=>'Sirajganj','Sunamganj'=>'Sunamganj','Sylhet'=>'Sylhet','Tangail'=>'Tangail','Thakurgaon'=>'Thakurgaon','Blagoevgrad'=>'Blagoevgrad','Burgas'=>'Burgas','Dobrich'=>'Dobrich','Gabrovo'=>'Gabrovo','Haskovo'=>'Haskovo','Kardzhali'=>'Kardzhali','Kyustendil'=>'Kyustendil','Lovech'=>'Lovech','Montana'=>'Montana','Pazardzhik'=>'Pazardzhik','Pernik'=>'Pernik','Pleven'=>'Pleven','Plovdiv'=>'Plovdiv','Razgrad'=>'Razgrad','Ruse'=>'Ruse','Shumen'=>'Shumen','Silistra'=>'Silistra','Sliven'=>'Sliven','Smolyan'=>'Smolyan','Sofia'=>'Sofia','Stara Zagora'=>'Stara Zagora','Targovishte'=>'Targovishte','Varna'=>'Varna','Veliko Tarnovo'=>'Veliko Tarnovo','Vidin'=>'Vidin','Vratsa'=>'Vratsa','Yambol'=>'Yambol','Acre'=>'Acre','Alagoas'=>'Alagoas','Amazonas'=>'Amazonas','Bahia'=>'Bahia','Distrito Federal'=>'Distrito Federal','Mato Grosso'=>'Mato Grosso','Mato Grosso do Sul'=>'Mato Grosso do Sul','Minas Gerais'=>'Minas Gerais','Pernambuco'=>'Pernambuco','Rio de Janeiro'=>'Rio de Janeiro','Rio Grande do Norte'=>'Rio Grande do Norte','Rio Grande do Sul'=>'Rio Grande do Sul','Roraima'=>'Roraima','Santa Catarina'=>'Santa Catarina','Sergipe'=>'Sergipe','Tocantins'=>'Tocantins','Alberta'=>'Alberta','British Columbia'=>'Britisch-Kolumbien','Manitoba'=>'Manitoba','New Brunswick'=>'New Brunswick','Newfoundland and Labrador'=>'Neufundland und Labrador','Northwest Territories'=>'Nordwest-Territorien','Nova Scotia'=>'Neuschottland','Nunavut'=>'Nunavut','Ontario'=>'Ontario','Prince Edward Island'=>'Prinz-Edward-Insel','Saskatchewan'=>'Saskatchewan','Yukon Territory'=>'Yukon','Albacete'=>'Albacete','Alicante'=>'Alicante','Asturias'=>'Asturias','Badajoz'=>'Badajoz','Baleares'=>'Balearen','Barcelona'=>'Barcelona','Burgos'=>'Burgos','Cantabria'=>'Kantabrien','Ceuta'=>'Ceuta','Ciudad Real'=>'Ciudad Real','Cuenca'=>'Cuenca','Girona'=>'Girona','Granada'=>'Granada','Guadalajara'=>'Guadalajara','Gipuzkoa'=>'Gipuzkoa','Huelva'=>'Huelva','Huesca'=>'Huesca','Las Palmas'=>'Las Palmas','Lleida'=>'Lleida','Lugo'=>'Lugo','Madrid'=>'Madrid','Melilla'=>'Melilla','Murcia'=>'Murcia','Navarra'=>'Navarra','Ourense'=>'Ourense','Palencia'=>'Palencia','Pontevedra'=>'Pontevedra','Salamanca'=>'Salamanca','Santa Cruz de Tenerife'=>'Santa Cruz de Tenerife','Segovia'=>'Segovia','Sevilla'=>'Sevilla','Soria'=>'Soria','Tarragona'=>'Tarragona','Teruel'=>'Teruel','Toledo'=>'Toledo','Valencia'=>'Valencia','Valladolid'=>'Valladolid','Zamora'=>'Zamora','Zaragoza'=>'Zaragoza','Hong Kong Island'=>'Hong Kong Island','Kowloon'=>'Kowloon','New Territories'=>'New Territories','Bács-Kiskun'=>'Bács-Kiskun','Békés'=>'Békés','Baranya'=>'Baranya','Borsod-Abaúj-Zemplén'=>'Borsod-Abaúj-Zemplén','Budapest'=>'Budapest','Fejér'=>'Fejér','Győr-Moson-Sopron'=>'Győr-Moson-Sopron','Hajdú-Bihar'=>'Hajdú-Bihar','Heves'=>'Heves','Jász-Nagykun-Szolnok'=>'Jász-Nagykun-Szolnok','Komárom-Esztergom'=>'Komárom-Esztergom','Nógrád'=>'Nógrád','Pest'=>'Pest','Somogy'=>'Somogy','Szabolcs-Szatmár-Bereg'=>'Szabolcs-Szatmár-Bereg','Tolna'=>'Tolna','Vas'=>'Vas','Veszprém'=>'Veszprém','Zala'=>'Zala','Daerah Istimewa Aceh'=>'Daerah Istimewa Aceh','Sumatera Utara'=>'Sumatera Utara','Sumatera Barat'=>'Sumatera Barat','Riau'=>'Riau','Kepulauan Riau'=>'Kepulauan Riau','Jambi'=>'Jambi','Sumatera Selatan'=>'Sumatera Selatan','Bangka Belitung'=>'Bangka Belitung','Bengkulu'=>'Bengkulu','Lampung'=>'Lampung','DKI Jakarta'=>'DKI Jakarta','Jawa Barat'=>'Jawa Barat','Banten'=>'Banten','Jawa Tengah'=>'Jawa Tengah','Jawa Timur'=>'Jawa Timur','Daerah Istimewa Yogyakarta'=>'Daerah Istimewa Yogyakarta','Bali'=>'Bali','Nusa Tenggara Barat'=>'Nusa Tenggara Barat','Nusa Tenggara Timur'=>'Nusa Tenggara Timur','Kalimantan Barat'=>'Kalimantan Barat','Kalimantan Tengah'=>'Kalimantan Tengah','Kalimantan Timur'=>'Kalimantan Timur','Kalimantan Selatan'=>'Kalimantan Selatan','Kalimantan Utara'=>'Kalimantan Utara','Sulawesi Utara'=>'Sulawesi Utara','Sulawesi Tengah'=>'Sulawesi Tengah','Sulawesi Tenggara'=>'Sulawesi Tenggara','Sulawesi Barat'=>'Sulawesi Barat','Sulawesi Selatan'=>'Sulawesi Selatan','Gorontalo'=>'Gorontalo','Maluku'=>'Maluku','Maluku Utara'=>'Maluku Utara','Papua'=>'Papua','Papua Barat'=>'Papua Barat','Andhra Pradesh'=>'Andhra Pradesh','Arunachal Pradesh'=>'Arunachal Pradesh','Assam'=>'Assam','Bihar'=>'Bihar','Chhattisgarh'=>'Chhattisgarh','Goa'=>'Goa','Gujarat'=>'Gujarat','Haryana'=>'Haryana','Himachal Pradesh'=>'Himachal Pradesh','Jharkhand'=>'Jharkhand','Karnataka'=>'Karnataka','Kerala'=>'Kerala','Madhya Pradesh'=>'Madhya Pradesh','Maharashtra'=>'Maharashtra','Manipur'=>'Manipur','Meghalaya'=>'Meghalaya','Mizoram'=>'Mizoram','Nagaland'=>'Nagaland','Punjab'=>'Punjab','Rajasthan'=>'Rajasthan','Sikkim'=>'Sikkim','Tamil Nadu'=>'Tamil Nadu','Telangana'=>'Telangana','Tripura'=>'Tripura','Uttarakhand'=>'Uttarakhand','Uttar Pradesh'=>'Uttar Pradesh','Chandigarh'=>'Chandigarh','Delhi'=>'Delhi','Pondicherry (Puducherry)'=>'Pondicherry (Puducherry)','Ilaam (ایلام)'=>'Ilaam (ایلام)','Bushehr (بوشهر)'=>'Bushehr (بوشهر)','Ardabil (اردبیل)'=>'Ardabil (اردبیل)','Isfahan (اصفهان)'=>'Isfahan (اصفهان)','Yazd (یزد)'=>'Yazd (یزد)','Kermanshah (کرمانشاه)'=>'Kermanshah (کرمانشاه)','Kerman (کرمان)'=>'Kerman (کرمان)','Hamadan (همدان)'=>'Hamadan (همدان)','Ghazvin (قزوین)'=>'Ghazvin (قزوین)','Zanjan (زنجان)'=>'Zanjan (زنجان)','Luristan (لرستان)'=>'Luristan (لرستان)','Alborz (البرز)'=>'Alborz (البرز)','East Azarbaijan (آذربایجان شرقی)'=>'East Azarbaijan (آذربایجان شرقی)','West Azarbaijan (آذربایجان غربی)'=>'West Azarbaijan (آذربایجان غربی)','Chaharmahal and Bakhtiari (چهارمحال و بختیاری)'=>'Chaharmahal and Bakhtiari (چهارمحال و بختیاری)','Semnan (سمنان)'=>'Semnan (سمنان)','Fars (فارس)'=>'Fars (فارس)','Qom (قم)'=>'Qom (قم)','Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)'=>'Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)','Golestan (گلستان)'=>'Golestan (گلستان)','Gilan (گیلان)'=>'Gilan (گیلان)','Mazandaran (مازندران)'=>'Mazandaran (مازندران)','Markazi (مرکزی)'=>'Markazi (مرکزی)','Hormozgan (هرمزگان)'=>'Hormozgan (هرمزگان)','Sistan and Baluchestan (سیستان و بلوچستان)'=>'Sistan and Baluchestan (سیستان و بلوچستان)','Agrigento'=>'Agrigento','Alessandria'=>'Alexandria','Ancona'=>'Ancona','Aosta'=>'Aosta','Arezzo'=>'Arezzo','Ascoli Piceno'=>'Ascoli Piceno','Asti'=>'Asti','Avellino'=>'Avellino','Bari'=>'Bari','Barletta-Andria-Trani'=>'Barletta-Andria-Trani','Belluno'=>'Belluno','Benevento'=>'Benevento','Bergamo'=>'Bergamo','West Bengal'=>'Westbengalen','Andaman and Nicobar Islands'=>'Andamanen und Nikobaren','Jammu and Kashmir'=>'Jammu und Kashmir','Daman and Diu'=>'Daman und Diu','Dadra and Nagar Haveli'=>'Dadra und Nagar Haveli','North Khorasan (خراسان شمالی)'=>'Nord-Chorasan (خراسان جنوبی)','Razavi Khorasan (خراسان رضوی)'=>'Razavi-Chorasan (خراسان رضوی)','South Khorasan (خراسان جنوبی)'=>'Süd-Chorasan (خراسان جنوبی)','Tehran (تهران)'=>'Teheran (تهران)','Khuzestan (خوزستان)'=>'Chuzestan (خوزستان)','Quebec'=>'Québec','Lakshadweep'=>'Lakshadweep','Kurdistan (کردستان)'=>'Kurdistan (کردستان)','Afghanistan'=>'Afghanistan','Albania'=>'Albanien','Algeria'=>'Algerien','Andorra'=>'Andorra','Angola'=>'Angola','Anguilla'=>'Anguilla','Antarctica'=>'Antarktika','Antigua and Barbuda'=>'Antigua und Barbuda','Argentina'=>'Argentinien','Armenia'=>'Armenien','Aruba'=>'Aruba','Australia'=>'Australien','Austria'=>'Österreich','Azerbaijan'=>'Aserbaidschan','Bahamas'=>'Bahamas','Bahrain'=>'Bahrain','Bangladesh'=>'Bangladesch','Barbados'=>'Barbados','Belgium'=>'Belgien','Belize'=>'Belize','Benin'=>'Benin','Bermuda'=>'Bermuda','Bhutan'=>'Bhutan','Bolivia'=>'Bolivien','Bosnia and Herzegovina'=>'Bosnien und Herzegowina','Botswana'=>'Botswana','Brazil'=>'Brasilien','British Indian Ocean Territory'=>'Britisches Territorium im Indischen Ozean','Brunei'=>'Brunei','Bulgaria'=>'Bulgarien','Burkina Faso'=>'Burkina Faso','Burundi'=>'Burundi','Cambodia'=>'Kambodscha','Cameroon'=>'Kamerun','Canada'=>'Kanada','Cape Verde'=>'Kap Verde','Central African Republic'=>'Zentralafrikanische Republik','Chad'=>'Tschad','Chile'=>'Chile','China'=>'China','Christmas Island'=>'Weihnachtsinsel','Colombia'=>'Kolumbien','Comoros'=>'Komoren','Congo (Brazzaville)'=>'Kongo-Brazzaville','Congo (Kinshasa)'=>'Kongo-Kinshasa','Cook Islands'=>'Cookinseln','Costa Rica'=>'Costa Rica','Croatia'=>'Kroatien','Cuba'=>'Kuba','Curaçao'=>'CuraÇao','Cyprus'=>'Zypern','Czech Republic'=>'Tschechien','Denmark'=>'Dänemark','Djibouti'=>'Dschibuti','Dominica'=>'Dominica','Dominican Republic'=>'Dominikanische Republik','Ecuador'=>'Ecuador','Egypt'=>'Ägypten','El Salvador'=>'El Salvador','Equatorial Guinea'=>'Äquatorialguinea','Eritrea'=>'Eritrea','Estonia'=>'Estland','Ethiopia'=>'Äthiopien','Falkland Islands'=>'Falklandinseln','Faroe Islands'=>'Färöer','Fiji'=>'Fidschi','Finland'=>'Finnland','France'=>'Frankreich','French Guiana'=>'Französisch-Guayana','French Polynesia'=>'Französisch-Polynesien','French Southern Territories'=>'Französische Süd- und Antarktisgebiete','Gabon'=>'Gabun','Gambia'=>'Gambia','Georgia'=>'Georgien','Germany'=>'Deutschland','Ghana'=>'Ghana','Gibraltar'=>'Gibraltar','Greece'=>'Griechenland','Greenland'=>'Grönland','Grenada'=>'Grenada','Guadeloupe'=>'Guadeloupe','Guatemala'=>'Guatemala','Guernsey'=>'Guernsey','Guinea'=>'Guinea','Guinea-Bissau'=>'Guinea-Bissau','Guyana'=>'Guyana','Haiti'=>'Haiti','Honduras'=>'Honduras','Hungary'=>'Ungarn','Iceland'=>'Island','India'=>'Indien','Indonesia'=>'Indonesien','Iran'=>'Iran','Iraq'=>'Irak','Isle of Man'=>'Isle of Man','Israel'=>'Israel','Italy'=>'Italien','Ivory Coast'=>'Elfenbeinküste','Jamaica'=>'Jamaika','Japan'=>'Japan','Jersey'=>'Jersey','Jordan'=>'Jordanien','Kazakhstan'=>'Kasachstan','Kenya'=>'Kenia','Kiribati'=>'Kiribati','Kuwait'=>'Kuwait','Kyrgyzstan'=>'Kirgisistan','Laos'=>'Laos','Latvia'=>'Lettland','Lebanon'=>'Libanon','Lesotho'=>'Lesotho','Liberia'=>'Liberia','Libya'=>'Libyen','Liechtenstein'=>'Liechtenstein','Lithuania'=>'Litauen','Luxembourg'=>'Luxemburg','Madagascar'=>'Madagaskar','Malawi'=>'Malawi','Malaysia'=>'Malaysia','Maldives'=>'Malediven','Mali'=>'Mali','Malta'=>'Malta','Marshall Islands'=>'Marshallinseln','Martinique'=>'Martinique','Mauritania'=>'Mauretanien','Mauritius'=>'Mauritius','Mayotte'=>'Mayotte','Mexico'=>'Mexiko','Micronesia'=>'Mikronesien','Monaco'=>'Monaco','Mongolia'=>'Mongolei','Montenegro'=>'Montenegro','Montserrat'=>'Montserrat','Morocco'=>'Marokko','Mozambique'=>'Mosambik','Myanmar'=>'Myanmar','Namibia'=>'Namibia','Nauru'=>'Nauru','Nepal'=>'Nepal','Netherlands'=>'Niederlande','New Caledonia'=>'Neukaledonien','New Zealand'=>'Neuseeland','Nicaragua'=>'Nicaragua','Niger'=>'Niger','Nigeria'=>'Nigeria','Niue'=>'Niue','Norfolk Island'=>'Norfolkinsel','North Korea'=>'Nordkorea','Norway'=>'Norwegen','Oman'=>'Oman','Pakistan'=>'Pakistan','Panama'=>'Panama','Papua New Guinea'=>'Papua-Neuguinea','Paraguay'=>'Paraguay','Peru'=>'Peru','Philippines'=>'Philippinen','Poland'=>'Polen','Portugal'=>'Portugal','Qatar'=>'Katar','Reunion'=>'Réunion','Romania'=>'Rumänien','Russia'=>'Russland','Saint Barthélemy'=>'Saint Barthélemy','Saint Helena'=>'St. Helena','Saint Kitts and Nevis'=>'St. Kitts und Nevis','Saint Pierre and Miquelon'=>'Saint-Pierre und Miquelon','Saint Vincent and the Grenadines'=>'St. Vincent und die Grenadinen','San Marino'=>'San Marino','São Tomé and Príncipe'=>'São Tomé and Príncipe','Saudi Arabia'=>'Saudi-Arabien','Senegal'=>'Senegal','Serbia'=>'Serbien','Seychelles'=>'Seychellen','Sierra Leone'=>'Sierra Leone','Singapore'=>'Singapur','Slovakia'=>'Slowakei','Slovenia'=>'Slowenien','Solomon Islands'=>'Salomonen','Somalia'=>'Somalia','South Africa'=>'Südafrika','South Georgia/Sandwich Islands'=>'Südgeorgien / Sandwich-Inseln','South Korea'=>'Südkorea','Spain'=>'Spanien','Sri Lanka'=>'Sri Lanka','Sudan'=>'Sudan','Sweden'=>'Schweden','Switzerland'=>'Schweiz','Syria'=>'Syrien','Tajikistan'=>'Tadschikistan','Tanzania'=>'Tansania','Thailand'=>'Thailand','Timor-Leste'=>'Osttimor','Togo'=>'Togo','Tokelau'=>'Tokelau','Tonga'=>'Tonga','Trinidad and Tobago'=>'Trinidad und Tobago','Tunisia'=>'Tunesien','Turkmenistan'=>'Turkmenistan','Turks and Caicos Islands'=>'Turks- und Caicosinseln','Tuvalu'=>'Tuvalu','Uganda'=>'Uganda','Ukraine'=>'Ukraine','Uruguay'=>'Uruguay','Uzbekistan'=>'Usbekistan','Vanuatu'=>'Vanuatu','Venezuela'=>'Venezuela','Vietnam'=>'Vietnam','Wallis and Futuna'=>'Wallis und Futuna','Yemen'=>'Jemen','Zambia'=>'Sambia','Zimbabwe'=>'Simbabwe','Buenos Aires'=>'Buenos Aires','Catamarca'=>'Catamarca','Chaco'=>'Chaco','Chubut'=>'Chubut','Corrientes'=>'Corrientes','Formosa'=>'Formosa','Jujuy'=>'Jujuy','La Pampa'=>'La Pampa','La Rioja'=>'La Rioja','Mendoza'=>'Mendoza','Misiones'=>'Misiones','Salta'=>'Salta','San Juan'=>'San Juan','San Luis'=>'San Luis','Santa Cruz'=>'Santa Cruz','Santa Fe'=>'Santa Fe','Santiago del Estero'=>'Santiago del Estero','Tierra del Fuego'=>'Tierra del Fuego','Australian Capital Territory'=>'Australisches Hauptstadtterritorium','New South Wales'=>'Neusüdwales','Northern Territory'=>'Nordterritorium','Queensland'=>'Queensland','South Australia'=>'Südaustralien','Tasmania'=>'Tasmanien','Victoria'=>'Victoria','Western Australia'=>'Westaustralien','Bagerhat'=>'Bagerhat','Bandarban'=>'Bandarban','Barguna'=>'Barguna','Bhola'=>'Bhola','Brahmanbaria'=>'Brahmanbaria','Chandpur'=>'Chandpur','Chuadanga'=>'Chuadanga','Cox\'s Bazar'=>'Cox\'s Bazar','Dhaka'=>'Dhaka','Dinajpur'=>'Dinajpur','Faridpur '=>'Faridpur ','Feni'=>'Feni','Gaibandha'=>'Gaibandha','Gazipur'=>'Gazipur','Gopalganj'=>'Gopalganj','Habiganj'=>'Habiganj','Jamalpur'=>'Jamalpur','Jhalokati'=>'Jhalokati','Jhenaidah'=>'Jhenaidah','Joypurhat'=>'Joypurhat','Khagrachhari'=>'Khagrachhari','Khulna'=>'Khulna','Kishoreganj'=>'Kishoreganj','Kurigram'=>'Kurigram','Kushtia'=>'Kushtia','Lakshmipur'=>'Lakshmipur','Lalmonirhat'=>'Lalmonirhat','Madaripur'=>'Madaripur','Magura'=>'Magura','Manikganj '=>'Manikganj ','Meherpur'=>'Meherpur','Moulvibazar'=>'Moulvibazar','Munshiganj'=>'Munshiganj','Mymensingh'=>'Mymensingh','Naogaon'=>'Naogaon','Narail'=>'Narail','Narayanganj'=>'Narayanganj','Narsingdi'=>'Narsingdi','Natore'=>'Natore','Nawabganj'=>'Nawabganj','Netrakona'=>'Netrakona','Nilphamari'=>'Nilphamari','Noakhali'=>'Noakhali','Pabna'=>'Pabna','Panchagarh'=>'Panchagarh','Patuakhali'=>'Patuakhali','Pirojpur'=>'Pirojpur','Rajbari'=>'Rajbari','Rajshahi'=>'Rajshahi','Rangamati'=>'Rangamati','Rangpur'=>'Rangpur','Satkhira'=>'Satkhira','Shariatpur'=>'Shariatpur','United States (US)'=>'Vereinigte Staaten von Amerika (USA)','United Kingdom (UK)'=>'Vereinigtes Königreich','Taiwan'=>'Taiwan','South Sudan'=>'Südsudan','Saint Martin (French part)'=>'St. Martin (französischer Teil)','Saint Lucia'=>'St. Lucia','Rwanda'=>'Ruanda','United Arab Emirates'=>'Vereinigte Arabische Emirate','Heard Island and McDonald Islands'=>'Heard und McDonaldinseln','Bouvet Island'=>'Bouvetinsel','Vatican'=>'Vatikanstadt','Pitcairn'=>'Pitcairninseln','Hong Kong'=>'Hongkong','Barishal'=>'Barisal','Bogura'=>'Bogra','Cumilla'=>'Comilla','Cocos (Keeling) Islands'=>'Kokosinseln (Keelinginseln)','Palestinian Territory'=>'Palästinensische Autonomiegebiete','Cayman Islands'=>'Kaimaninseln','Western Sahara'=>'Westsahara','Belarus'=>'Belarus','Moldova'=>'Moldau','Svalbard and Jan Mayen'=>'Spitzbergen und Jan Mayen','Suriname'=>'Surinam','Bonaire, Saint Eustatius and Saba'=>'Bonaire, Sint Eustatius und Saba','Belau'=>'Palau','Saint Martin (Dutch part)'=>'Saint Martin (niederländischer Teil)']];lue_raw, 'options' ); if ( $timeout_raw !== null ) { wp_cache_set( $timeout_name, $timeout_raw, 'options' ); } // Also populate our helper's static cache in case anything // reads the raw transient row through our helper's get_option. self::$option_cache[ $value_name ] = maybe_unserialize( $value_raw ); $primed++; } self::log_op( 'db_helpers.preload', 'preload_transients.result', array( 'requested' => count( $valid_keys ), 'fetched' => count( $to_fetch ) / 2, 'primed' => $primed, ) ); return $primed; } /** * Update site option * * @param $option * @param $value * @return bool */ public static function update_option($option, $value, $autoload = null) { global $wpdb; if ( is_scalar( $option ) ) { $option = trim( $option ); } if ( empty( $option ) ) { return false; } wp_protect_special_option( $option ); if ( is_object( $value ) ) { $value = clone $value; } $value = sanitize_option( $option, $value ); // Existence check straight from the DB — DO NOT trust get_option() // for this. get_option() caches the (filtered) default value in // self::$option_cache when the row is missing, so a later call with // a different default returns the earlier default instead of the // truth. That poisoning is exactly what caused update_option to // attempt $wpdb->update() against a row that didn't exist, log // success with rows=0, and silently drop the write. $row_exists = (bool) $wpdb->get_var( $wpdb->prepare( "SELECT 1 FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); if ( ! $row_exists ) { // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.update_option', 'update_option.route_to_add', [ 'option' => $option, 'value' => $value, 'reason' => 'row_missing', ]); return self::add_option( $option, $value, $autoload ); } $old_value = self::get_option( $option ); // If the new and old values are the same, no need to update. if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) { // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.update_option', 'update_option.blocked_same_value', [ 'option' => $option, 'value' => $value, 'old_value' => $old_value, ]); return false; } $serialized_value = maybe_serialize( $value ); $update_args = array( 'option_value' => $serialized_value, ); // Retrieve the current autoload value to reevaluate it in case it was set automatically. $raw_autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); $allow_values = array( 'auto-on', 'auto-off', 'auto' ); // If the caller explicitly asked for an autoload value, honor it — // this is what the third argument was meant to do and didn't, because // update_option() used to only accept two params. if ( $autoload !== null ) { $resolved_autoload = static::determine_option_autoload_value( $option, $value, $serialized_value, $autoload ); if ( $resolved_autoload !== $raw_autoload ) { $update_args['autoload'] = $resolved_autoload; } } elseif ( in_array( $raw_autoload, $allow_values, true ) ) { // Caller didn't pass one — re-evaluate if the current stored // autoload is an "auto*" value (i.e. previously auto-decided). $resolved_autoload = static::determine_option_autoload_value( $option, $value, $serialized_value, null ); if ( $resolved_autoload !== $raw_autoload ) { $update_args['autoload'] = $resolved_autoload; } } self::bust_cache( $option ); // Pre-write raw read on the SAME $wpdb connection. Comparing this to // $old_value (from get_option) tells us whether a read replica is // serving stale data vs. what the primary currently holds. $pre_raw = null; if ( defined( 'MAILCHIMP_LOG_OPTIONS' ) && MAILCHIMP_LOG_OPTIONS ) { $pre_raw = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); } $result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) ); // Post-write raw read. After a write, most read/write-split drivers // (HyperDB, LudicrousDB, managed-host proxies) pin this connection to // the primary for the rest of the request — so this value is // authoritative for what actually landed on disk. $post_raw = null; $dup_count = null; if ( defined( 'MAILCHIMP_LOG_OPTIONS' ) && MAILCHIMP_LOG_OPTIONS ) { $post_raw = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); $dup_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->options WHERE option_name = %s", $option ) ); } // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.update_option', 'update_option.result', [ 'option' => $option, 'value' => $value, 'old_value' => $old_value, 'pre_raw' => $pre_raw, // what raw wpdb saw BEFORE the update 'post_raw' => $post_raw, // what raw wpdb sees AFTER the update 'row_count' => $dup_count, // >1 means duplicate option_name rows 'rows' => $result, 'success' => $result !== false, 'noop' => $result === 0, 'db_error' => $wpdb->last_error ?: null, ]); // $wpdb->update() returns rows-changed (0 when value is already current), // or false on real error. Only false is a failure. if ( $result === false ) { return false; } self::bust_cache( $option, $value, true ); return true; } /** * Delete site option * * @param $option * @return bool */ public static function delete_option($option) { global $wpdb; self::bust_cache( $option ); if ( is_scalar( $option ) ) { $option = trim( $option ); } if ( empty( $option ) ) { return false; } wp_protect_special_option( $option ); // Get the ID, if no ID then return. $row = $wpdb->get_row( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ); if ( is_null( $row ) ) { return false; } $result = $wpdb->delete( $wpdb->options, array( 'option_name' => $option ) ); // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.delete_option', 'delete_option.result', [ 'option' => $option, 'rows' => $result, 'success' => (bool) $result, 'db_error' => $wpdb->last_error ?: null, ]); if ( $result ) { return true; } else { return false; } } /** * @param $key * @param $by * @return bool */ public static function increment($key, $by = 1) { $option = (int) static::get_option( $key, 0); return static::add_option($key, $option+$by); } /** * @param $key * @param $by * @return bool|null */ public static function decrement($key, $by = 1) { $option = (int) static::get_option( $key, 0); if ($option <= 0) { return null; } return static::add_option($key, $option-$by); } /** * Set site transient * * @param $transient * @param $value * @param $expiration * @return bool */ public static function set_transient( $transient, $value, $expiration = 0 ) { // Delegate to WP core. With an external object cache (Redis, etc.) // this is a single cache-layer write with native TTL and zero // wp_options I/O. Without one, core handles the same _transient_* / // _transient_timeout_* row pair we were managing by hand, but with // fewer round-trips and proper locking. return set_transient( $transient, $value, (int) $expiration ); } /** * Get site transient * * @param $transient * @return mixed */ public static function get_transient( $transient ) { return get_transient( $transient ); } /** * Delete site transient * * @param $transient * @return bool */ public static function delete_transient( $transient ) { return delete_transient( $transient ); } protected static function determine_option_autoload_value($option, $value, $serialized_value, $autoload = null) { if (function_exists('wp_determine_option_autoload_value')) { return wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload ); } // Check if autoload is a boolean. if ( is_bool( $autoload ) ) { return $autoload ? 'on' : 'off'; } switch ( $autoload ) { case 'on': case 'yes': return 'on'; case 'off': case 'no': return 'off'; } $autoload = apply_filters( 'wp_default_autoload_value', null, $option, $value, $serialized_value ); if ( is_bool( $autoload ) ) { return $autoload ? 'auto-on' : 'auto-off'; } return 'auto'; } }lue_raw, 'options' ); if ( $timeout_raw !== null ) { wp_cache_set( $timeout_name, $timeout_raw, 'options' ); } // Also populate our helper's static cache in case anything // reads the raw transient row through our helper's get_option. self::$option_cache[ $value_name ] = maybe_unserialize( $value_raw ); $primed++; } self::log_op( 'db_helpers.preload', 'preload_transients.result', array( 'requested' => count( $valid_keys ), 'fetched' => count( $to_fetch ) / 2, 'primed' => $primed, ) ); return $primed; } /** * Update site option * * @param $option * @param $value * @return bool */ public static function update_option($option, $value, $autoload = null) { global $wpdb; if ( is_scalar( $option ) ) { $option = trim( $option ); } if ( empty( $option ) ) { return false; } wp_protect_special_option( $option ); if ( is_object( $value ) ) { $value = clone $value; } $value = sanitize_option( $option, $value ); // Existence check straight from the DB — DO NOT trust get_option() // for this. get_option() caches the (filtered) default value in // self::$option_cache when the row is missing, so a later call with // a different default returns the earlier default instead of the // truth. That poisoning is exactly what caused update_option to // attempt $wpdb->update() against a row that didn't exist, log // success with rows=0, and silently drop the write. $row_exists = (bool) $wpdb->get_var( $wpdb->prepare( "SELECT 1 FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); if ( ! $row_exists ) { // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.update_option', 'update_option.route_to_add', [ 'option' => $option, 'value' => $value, 'reason' => 'row_missing', ]); return self::add_option( $option, $value, $autoload ); } $old_value = self::get_option( $option ); // If the new and old values are the same, no need to update. if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) { // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.update_option', 'update_option.blocked_same_value', [ 'option' => $option, 'value' => $value, 'old_value' => $old_value, ]); return false; } $serialized_value = maybe_serialize( $value ); $update_args = array( 'option_value' => $serialized_value, ); // Retrieve the current autoload value to reevaluate it in case it was set automatically. $raw_autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); $allow_values = array( 'auto-on', 'auto-off', 'auto' ); // If the caller explicitly asked for an autoload value, honor it — // this is what the third argument was meant to do and didn't, because // update_option() used to only accept two params. if ( $autoload !== null ) { $resolved_autoload = static::determine_option_autoload_value( $option, $value, $serialized_value, $autoload ); if ( $resolved_autoload !== $raw_autoload ) { $update_args['autoload'] = $resolved_autoload; } } elseif ( in_array( $raw_autoload, $allow_values, true ) ) { // Caller didn't pass one — re-evaluate if the current stored // autoload is an "auto*" value (i.e. previously auto-decided). $resolved_autoload = static::determine_option_autoload_value( $option, $value, $serialized_value, null ); if ( $resolved_autoload !== $raw_autoload ) { $update_args['autoload'] = $resolved_autoload; } } self::bust_cache( $option ); // Pre-write raw read on the SAME $wpdb connection. Comparing this to // $old_value (from get_option) tells us whether a read replica is // serving stale data vs. what the primary currently holds. $pre_raw = null; if ( defined( 'MAILCHIMP_LOG_OPTIONS' ) && MAILCHIMP_LOG_OPTIONS ) { $pre_raw = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); } $result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) ); // Post-write raw read. After a write, most read/write-split drivers // (HyperDB, LudicrousDB, managed-host proxies) pin this connection to // the primary for the rest of the request — so this value is // authoritative for what actually landed on disk. $post_raw = null; $dup_count = null; if ( defined( 'MAILCHIMP_LOG_OPTIONS' ) && MAILCHIMP_LOG_OPTIONS ) { $post_raw = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); $dup_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->options WHERE option_name = %s", $option ) ); } // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.update_option', 'update_option.result', [ 'option' => $option, 'value' => $value, 'old_value' => $old_value, 'pre_raw' => $pre_raw, // what raw wpdb saw BEFORE the update 'post_raw' => $post_raw, // what raw wpdb sees AFTER the update 'row_count' => $dup_count, // >1 means duplicate option_name rows 'rows' => $result, 'success' => $result !== false, 'noop' => $result === 0, 'db_error' => $wpdb->last_error ?: null, ]); // $wpdb->update() returns rows-changed (0 when value is already current), // or false on real error. Only false is a failure. if ( $result === false ) { return false; } self::bust_cache( $option, $value, true ); return true; } /** * Delete site option * * @param $option * @return bool */ public static function delete_option($option) { global $wpdb; self::bust_cache( $option ); if ( is_scalar( $option ) ) { $option = trim( $option ); } if ( empty( $option ) ) { return false; } wp_protect_special_option( $option ); // Get the ID, if no ID then return. $row = $wpdb->get_row( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ); if ( is_null( $row ) ) { return false; } $result = $wpdb->delete( $wpdb->options, array( 'option_name' => $option ) ); // TEMP LOGGING — gated by MAILCHIMP_LOG_OPTIONS; remove once verified self::log_op('db_helpers.delete_option', 'delete_option.result', [ 'option' => $option, 'rows' => $result, 'success' => (bool) $result, 'db_error' => $wpdb->last_error ?: null, ]); if ( $result ) { return true; } else { return false; } } /** * @param $key * @param $by * @return bool */ public static function increment($key, $by = 1) { $option = (int) static::get_option( $key, 0); return static::add_option($key, $option+$by); } /** * @param $key * @param $by * @return bool|null */ public static function decrement($key, $by = 1) { $option = (int) static::get_option( $key, 0); if ($option <= 0) { return null; } return static::add_option($key, $option-$by); } /** * Set site transient * * @param $transient * @param $value * @param $expiration * @return bool */ public static function set_transient( $transient, $value, $expiration = 0 ) { // Delegate to WP core. With an external object cache (Redis, etc.) // this is a single cache-layer write with native TTL and zero // wp_options I/O. Without one, core handles the same _transient_* / // _transient_timeout_* row pair we were managing by hand, but with // fewer round-trips and proper locking. return set_transient( $transient, $value, (int) $expiration ); } /** * Get site transient * * @param $transient * @return mixed */ public static function get_transient( $transient ) { return get_transient( $transient ); } /** * Delete site transient * * @param $transient * @return bool */ public static function delete_transient( $transient ) { return delete_transient( $transient ); } protected static function determine_option_autoload_value($option, $value, $serialized_value, $autoload = null) { if (function_exists('wp_determine_option_autoload_value')) { return wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload ); } // Check if autoload is a boolean. if ( is_bool( $autoload ) ) { return $autoload ? 'on' : 'off'; } switch ( $autoload ) { case 'on': case 'yes': return 'on'; case 'off': case 'no': return 'off'; } $autoload = apply_filters( 'wp_default_autoload_value', null, $option, $value, $serialized_value ); if ( is_bool( $autoload ) ) { return $autoload ? 'auto-on' : 'auto-off'; } return 'auto'; } }