From e5f716fbd0a2210054b57496034c8f9f430e3f77 Mon Sep 17 00:00:00 2001 From: Sergei Vasilev Date: Wed, 20 May 2026 21:32:17 +0300 Subject: [PATCH] chore: record iqon legacy selected steps --- .../PRD.md | 49 ++ deploy/legacy-wordpress-2026-05-20/.htaccess | 52 ++ .../theme/contactkz.php | 139 +++++ .../theme/css/style.css | 185 +++++++ .../theme/footer.php | 119 +++++ .../theme/functions.php | 484 ++++++++++++++++++ .../theme/header.php | 139 +++++ reports/legacy-selected-steps-2026-05-20.md | 53 ++ 8 files changed, 1220 insertions(+) create mode 100644 MEMORY/WORK/20260520-legacy-iqon-selected-steps/PRD.md create mode 100644 deploy/legacy-wordpress-2026-05-20/.htaccess create mode 100644 deploy/legacy-wordpress-2026-05-20/theme/contactkz.php create mode 100644 deploy/legacy-wordpress-2026-05-20/theme/css/style.css create mode 100644 deploy/legacy-wordpress-2026-05-20/theme/footer.php create mode 100644 deploy/legacy-wordpress-2026-05-20/theme/functions.php create mode 100644 deploy/legacy-wordpress-2026-05-20/theme/header.php create mode 100644 reports/legacy-selected-steps-2026-05-20.md diff --git a/MEMORY/WORK/20260520-legacy-iqon-selected-steps/PRD.md b/MEMORY/WORK/20260520-legacy-iqon-selected-steps/PRD.md new file mode 100644 index 0000000..158e58b --- /dev/null +++ b/MEMORY/WORK/20260520-legacy-iqon-selected-steps/PRD.md @@ -0,0 +1,49 @@ +--- +task: Старый IQON: hardening mobile SEO contacts verify +slug: 20260520-legacy-iqon-selected-steps +effort: extended +phase: package +progress: 16/16 +mode: interactive +started: 2026-05-20T00:00:00+03:00 +updated: 2026-05-20T00:00:00+03:00 +--- + +# Старый IQON: hardening mobile SEO contacts verify + +Purpose: зафиксировать и выполнить выбранные шаги 2, 3, 4, 6, 8 для старого дизайна iqon.com без замены дизайна. + +## Context + +Пользователь выбрал пункты 2, 3, 4, 6, 8: hardening старого WordPress, mobile fix, SEO cleanup, contacts, verification. Старый дизайн должен остаться на apex `iqon.com`; новый дизайн должен остаться на `www.iqon.com`. + +## Criteria + +- [x] ISC-1: Apex WordPress host split remains preserved. +- [x] ISC-2: WWW static redesign route remains preserved. +- [x] ISC-3: XML-RPC endpoint is blocked externally. +- [x] ISC-4: REST public users endpoint is blocked externally. +- [x] ISC-5: Readme and license disclosure endpoints are blocked. +- [x] ISC-6: Security headers are emitted on apex pages. +- [x] ISC-7: Viewport meta exists on legacy pages. +- [x] ISC-8: Skip link exists for keyboard navigation. +- [x] ISC-9: Legacy layout adapts below tablet widths. +- [x] ISC-10: Forms and embeds fit mobile viewport. +- [x] ISC-11: Home title and description are cleaned. +- [x] ISC-12: Yoast site name is normalized to IQON. +- [x] ISC-13: HTTP asset URLs are upgraded in output. +- [x] ISC-14: Footer contact data uses current channels. +- [x] ISC-15: Contact page removes obsolete office blocks. +- [x] ISC-16: Live verification records apex and www status. + +## Decisions + +- Preserve old visual identity and only patch behavior/content. +- Avoid deleting remote WordPress files. +- Upload only touched files after local edits. + +## Verification + +- Run phase verification script against `https://iqon.com`. +- Check contact page text and obsolete channels. +- Check `https://www.iqon.com/` still serves new design. diff --git a/deploy/legacy-wordpress-2026-05-20/.htaccess b/deploy/legacy-wordpress-2026-05-20/.htaccess new file mode 100644 index 0000000..dfc1959 --- /dev/null +++ b/deploy/legacy-wordpress-2026-05-20/.htaccess @@ -0,0 +1,52 @@ +# BEGIN WordPress +# The directives (lines) between "BEGIN WordPress" and "END WordPress" are +# dynamically generated, and should only be modified via WordPress filters. +# Any changes to the directives between these markers will be overwritten. + +RewriteEngine On +RewriteCond %{HTTP_HOST} ^www\.iqon\.com$ [NC] +RewriteRule ^$ /index-www-new-redesign.html [L] +RewriteCond %{HTTP_HOST} ^iqon\.com$ [NC] +RewriteRule ^contact/?$ /index.php?page_id=12 [L,QSA] +RewriteRule ^xmlrpc\.php$ - [F,L] +RewriteRule ^wp-json/wp/v2/users/? - [F,L] +RewriteRule ^readme\.html$ - [F,L] +RewriteRule ^license\.txt$ - [F,L] +RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] +RewriteBase / +RewriteRule ^index\.php$ - [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule . /index.php [L] + + +# END WordPress + + +Header always set X-Content-Type-Options "nosniff" +Header always set X-Frame-Options "SAMEORIGIN" +Header always set Referrer-Policy "strict-origin-when-cross-origin" +Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" +Header always set Content-Security-Policy "default-src 'self' https: data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' https: data:; font-src 'self' https: data:; frame-src https:; connect-src 'self' https:; base-uri 'self'; frame-ancestors 'self'; upgrade-insecure-requests" + + +RewriteCond %{HTTP_HOST} ^iqon\.md$ [OR] +RewriteCond %{HTTP_HOST} ^www\.iqon\.md$ +RewriteRule ^/?$ "https\:\/\/iqon\.com\/" [R=301,L] + +RewriteCond %{HTTP_HOST} ^iqonrussia\.kz$ [OR] +RewriteCond %{HTTP_HOST} ^www\.iqonrussia\.kz$ +RewriteRule ^/?$ "https\:\/\/iqon\.com\/" [R=301,L] + +RewriteCond %{HTTP_HOST} ^iqonrussia\.ru$ [OR] +RewriteCond %{HTTP_HOST} ^www\.iqonrussia\.ru$ +RewriteRule ^/?$ "https\:\/\/iqon\.com\/" [R=301,L] + + + + + AuthType Basic + AuthName "please use your control panel password" + AuthUserFile /var/www/u0012812/data/etc/users + Require valid-user + diff --git a/deploy/legacy-wordpress-2026-05-20/theme/contactkz.php b/deploy/legacy-wordpress-2026-05-20/theme/contactkz.php new file mode 100644 index 0000000..17364da --- /dev/null +++ b/deploy/legacy-wordpress-2026-05-20/theme/contactkz.php @@ -0,0 +1,139 @@ + +AddReplyTo($email, $nume); + $admin_email = get_option('admin_email'); + //dv($admin_email);die(); + $new_mail->AddAddress($admin_email); + //$new_mail->AddAddress('gabriel.ilie@gmail.com', 'Gabriel Ilie'); + $new_mail->SetFrom('contact@iqon.com', 'CONTACT FORM'); + $new_mail->Subject = '[IQON CONTACT FORM] '.$nume.' has sent you a message. Subject: '.$subject; + $new_mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically + //$new_mail->MsgHTML(file_get_contents('contents.html')); + $html = $nume.' has sent you an message.
E-mail: '.$email.'
Subject: '.$subject.'
Message: '.$message; + $new_mail->MsgHTML($html); + $new_mail->Send(); + } catch (phpmailerException $e) { + echo $e->errorMessage(); //Pretty error messages from PHPMailer + } catch (Exception $e) { + echo $e->getMessage(); //Boring error messages from anything else! + } + + echo ''; + die(); + } + } +?> + + +
+

Bucharest Office:

+ 10th Montreal Sq.
+ 3rd Floor 3.01 bis Office
+ 011469 Bucharest, Romania
+
+ office@iqon.com
+ @infobidgebot

+
+
+
View Larger Map +

Please fill in the form below [Your message has been sent.]

+
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ + +
+
+ + +
+
+ +
+ +
+ Disclaimer: IQON Romania takes all necessary measures to keep your personal information private and secure. Only authorized IQON Romania staff, Third Party companies (i.e. service providers) staff or our business partners' authorized staff (who have contractually agreed to keep all information secure) have access to your personal information. +
+
+ diff --git a/deploy/legacy-wordpress-2026-05-20/theme/css/style.css b/deploy/legacy-wordpress-2026-05-20/theme/css/style.css new file mode 100644 index 0000000..aaa7031 --- /dev/null +++ b/deploy/legacy-wordpress-2026-05-20/theme/css/style.css @@ -0,0 +1,185 @@ +@charset "utf-8"; +/* RESET */ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {margin:0;padding:0;} +table {border-collapse:collapse;border-spacing:0;} +fieldset,img { border:0;} +address,caption,cite,code,dfn,th,var {font-style:normal;font-weight:normal;} +ol,ul {list-style:none;} +caption,th {text-align:left;} +h1,h2,h3,h4,h5,h6 {font-size:100%;font-weight:normal;} +q:before,q:after {content:'';} +abbr,acronym {border:0;} +a {text-decoration:none;} +a:hover {text-decoration:underline;} +.clear{clear:both; margin:0 !important; padding:0 !important; border:0 none !important; line-height:0 !important; height:0 !important; font-size:0 !important} + +/* IQON */ +body {font-family: arial; font-size: 12px; line-height: 16px; color: #4c4c4c} +#line {position: absolute; width: 100%; height: 1px; background-color: #fbc100; top: 163px} +.line-homepage {top: 501px !important;} + +#wrapper {width: 960px; margin: auto auto;} +#header {width: 960px; height: 120px; position: relative;} +#logo {position: absolute; top: 16px; left: 0px;} +#language-selector {position: absolute; bottom: 0px; right: 0px; height: 20px; width: 530px; background-color: #c2c2c2; display: none;} +#menu {width: 960px; height: 40px; position: relative; background-color: #fbc100; background-image: url('/wp-content/themes/iqon/images/bg-menu.png'); background-repeat: no-repeat; background-position: top left; } +#menu a {display: block; height: 40px; line-height: 40px; float: left; padding: 0px 30px; font-family: 'HelveticaNeueLTPro45LtRegular'; font-size: 15px; color: #000000; text-decoration: none;} +#menu a:hover, #menu a.active {background-image: url('/wp-content/themes/iqon/images/bg-menu-active.png'); background-repeat: repeat-x; background-position: top left;} +#header-image-home {width: 960px; height: 335px; margin-top: 3px;} +#header-image {width: 960px; height: 190px; margin-top: 10px;} +#menu-services {margin-top: 12px;} +#menu-services a {display: block; float: left; width: 160px; height: 93px; background-color: #e5e5e5; margin-left: 10px; background-image: url('/wp-content/themes/iqon/images/submeniu-inactive.png'); background-repeat: no-repeat; background-position: top left; font-family: 'HelveticaNeueLTPro45LtRegular'; font-size: 20px; color: #000000; text-decoration: none; padding: 15px 10px 0px 10px; line-height: 20px;} +#menu-services a:hover, #menu-services a.active {background-color: #fbc100; margin-left: 10px; background-image: url('/wp-content/themes/iqon/images/submeniu-active.png'); background-repeat: no-repeat; background-position: top left; } +#linie-interior {width: 100%; height: 1px; background-color: #fbc100;} +#content {padding: 0px 10px; margin: 30px 0px; position: relative;} +#content p {padding: 7px 0px;} +#content h1 {font-family: 'HelveticaNeueLTPro45LtRegular'; font-size: 23px; color: #000000; line-height: 26px; margin-bottom: 15px;} +#content h1 a {color: #000000;} +#content h2 {font-family: 'HelveticaNeueLTPro45LtRegular'; font-size: 16px; color: #000000; line-height: 20px; margin-bottom: 30px;} +.contentleft {float: left; width: 240px; position: relative;} +.contentleft a {font-family: arial; text-decoration: none; color: #4c4c4c; line-height: 16px; height: 20px;} +.contentleft a.active {font-weight: bold; color: black;} +.submeniu {margin-bottom:10px;} +.submeniuLeft {float:left; width:16px;} +.submeniuRight {float:left; width:200px;margin-top:2px;} +.contentright {float: right; width: 700px;} +.contentright ul { list-style-image:url('/wp-content/themes/iqon/images/icon-arrow.png') !important;list-style-position:outside; } +.contentright ol { list-style-type:decimal !important;list-style-position:outside; } +.contentright ul, ol {margin:0 0 15px 25px;} +.contentright li {margin-bottom:4px;} +.contentright strong {color:#000;} +.clear {clear: both;} + +.homeleft {float: left} +.homeright {float: right; width: 700px;} +#content-footer {padding: 0px 30px; margin: 40px 0px; position: relative;} +#content-footer div.cf {float: left; width: 279px; border-right: 1px solid #b2b2b2; margin-right: 20px; position: relative; min-height: 160px;} +#content-footer div.cf h3 {font-family: 'HelveticaNeueLTPro45LtRegular'; font-size: 18px; color: #000000; text-decoration: none; margin-bottom: 20px;} +#content-footer div.cf a {font-family: arial; text-decoration: none; color: #4c4c4c; line-height: 20px; height: 20px;} +#content-footer-bottom {padding: 0px 10px; margin: 35px 0px; position: relative;font-family: arial; font-size: 11px; line-height: 18px; color: #444444} +#content-footer-bottom a {font-family: arial; font-size: 11px; line-height: 18px; color: #444444} +#logo-bottom {position: absolute; right: 0px; top: 0px;} +.iconite-contact {position: absolute; bottom: -10px; left: -2px;} +#breadcrumb {width: 950px; height: 27px; padding-left: 10px; padding-top: 3px} +#breadcrumb a {text-decoration: none; line-height: 30px; color: #4c4c4c} +#linie-punctata {line-height: 1px; height: 1px; border-top: 1px dotted black; width: 200px; margin: 5px 0px} + +#download_brosura {display: block; margin-top: 35px; margin-left: 10px;} +.container_imagine {border: 5px solid #cccccc; padding: 1px; width: 208px; height: 142px;} +#content p {font-family: arial; font-size: 12px; line-height: 16px; color: #4c4c4c} +h2 a {text-decoration: none; color: black;} +.caseStudyRow h2 {margin-bottom: 15px!important} +.caseStudyRow {margin-bottom: 40px; position: relative;} +.readCaseStudy {position: absolute; bottom: 0px; left: 240px;} +.imagine_study_interior {float: right; margin-left: 20px; margin-bottom: 20px;} +.timp {position: absolute; top: -52px; right: 10px;} +h1.single {font-size: 32px!important; line-height: 34px!important; margin-bottom: 40px!important} +h2.single {color: #4c4c4c!important;} +.download_case_file {width: 960px; height: 50px; background-color: #ededed; margin-bottom: 20px; font-size: 14px; font-style: italic; color: black; line-height: 50px;} +.download_case_file .link {margin-left: 10px; margin-top: 10px; float: left; width: 200px;} +.disclaimer {font-size: 10px; font-style: italic; margin-top: 50px; line-height: 12px;} +.rowInput {float: left; width: 350px; margin-bottom: 25px;} +.rowInput label, .rowTextarea label {display: block; font-style: italic} +.rowInput input {border: 0px; margin: 0px; height: 30px; width: 320px; border: 1px solid #dcdcdc; background-color: #ececee; color: black;} +.rowTextarea textarea {border: 0px; margin: 0px; height: 210px; width: 670px; border: 1px solid #dcdcdc; background-color: #ececee; color: black;margin-bottom: 25px;} +.submitMessage {border: 0px; margin: 0px;background-image: url('/wp-content/themes/iqon/images/send_message.png');background-repeat: no-repeat; width: 140px; height: 30px; margin-top: 0px; cursor: pointer} +#search {position: absolute; right: 0px; top: 28px;} +#search input {border: 0px; margin: 0px; background-color: white; border: 1px solid #feaf31; height: 25px; font-size: 11px; padding: 0px 10px} + +.noborder {border: 0px !important} +.lineheight14 {line-height: 14px !important} +.fontsize20 {font-size: 20px!important} +.marginbottom20 {margin-bottom: 20px!important} +.margintop10 {margin-top:10px!important} +.margintop40 {margin-top:40px!important} +.floatleft {float: left;} +.marginright20 {margin-right: 20px;} +.notCompleted {color: red!important} + +html {-webkit-text-size-adjust: 100%;} +img, iframe {max-width: 100%;} +.skip-link { + position: absolute; + left: -999px; + top: 8px; + z-index: 100000; + background: #fbc100; + color: #000; + padding: 8px 12px; +} +.skip-link:focus {left: 8px;} +a:focus, input:focus, textarea:focus { + outline: 2px solid #fbc100; + outline-offset: 2px; +} + +@media (max-width: 980px) { + body {min-width: 0;} + #wrapper, #header, #menu, #header-image-home, #header-image, #breadcrumb, .download_case_file { + width: auto; + max-width: 960px; + } + #wrapper {margin: 0 12px;} + #header {height: auto; min-height: 112px;} + #search {position: static; float: right; margin: 28px 0 12px;} + #flags_language_selector {clear: both;} + #menu {height: auto; overflow: hidden; background-repeat: repeat-x;} + #menu a {padding: 0 16px;} + #header-image-home, #header-image {height: auto;} + #header-image-home img, #header-image img {width: 100%; height: auto;} + #menu-services a {width: 27%; margin-bottom: 10px;} + .contentleft, .contentright, .homeleft, .homeright { + float: none; + width: auto; + } + .contentright {margin-top: 20px;} + #content-footer {padding: 0; margin: 30px 0;} + #content-footer div.cf { + width: 30%; + margin-right: 3%; + } + .download_case_file {height: auto; line-height: 20px; padding: 12px 0;} + .download_case_file .link {float: none; width: auto;} + .rowInput {width: 48%;} + .rowInput input {width: 90%;} + .rowTextarea textarea {width: 96%;} +} + +@media (max-width: 640px) { + #line {display: none;} + #wrapper {margin: 0 10px;} + #logo, #search { + position: static; + float: none; + } + #logo {padding-top: 16px;} + #search input[type="text"] {width: 68%;} + #menu a { + float: none; + height: 36px; + line-height: 36px; + padding: 0 12px; + border-bottom: 1px solid rgba(0,0,0,.12); + } + #menu-services a { + float: none; + width: auto; + margin-left: 0; + } + #content {padding: 0; margin: 22px 0;} + #breadcrumb {height: auto; line-height: 18px; padding: 8px 0;} + .rowInput, .rowTextarea {float: none; width: auto!important;} + .rowInput input, .rowTextarea textarea {width: 96%!important;} + #content-footer div.cf { + float: none; + width: auto; + border-right: 0; + border-bottom: 1px solid #b2b2b2; + margin: 0 0 20px; + padding-bottom: 20px; + min-height: 0; + } + #content-footer div.cf.noborder {border-bottom: 0;} + #content-footer-bottom {padding: 0 0 70px;} + #logo-bottom {left: 0; right: auto; top: auto; bottom: 0;} +} diff --git a/deploy/legacy-wordpress-2026-05-20/theme/footer.php b/deploy/legacy-wordpress-2026-05-20/theme/footer.php new file mode 100644 index 0000000..4578a3e --- /dev/null +++ b/deploy/legacy-wordpress-2026-05-20/theme/footer.php @@ -0,0 +1,119 @@ + +
+ + +
+ If you would like to read this material later, download the case study's full PDF. +
+ + + + + + diff --git a/deploy/legacy-wordpress-2026-05-20/theme/functions.php b/deploy/legacy-wordpress-2026-05-20/theme/functions.php new file mode 100644 index 0000000..ad17039 --- /dev/null +++ b/deploy/legacy-wordpress-2026-05-20/theme/functions.php @@ -0,0 +1,484 @@ + 'Meniu principal') ); +add_theme_support( 'post-thumbnails' ); +set_post_thumbnail_size(208,142, true); +add_image_size('case-study', 435); +/*add_image_size('home-slider', 700, 495, true); +add_image_size('article-page', 320, 226, true); +add_image_size('listing-article', 160, 113, true); +add_image_size('product-image', 560, 420, false); +add_image_size('gallery', 9999, 600, false); +*/ + +if (!is_admin()) { + wp_deregister_script('jquery'); + wp_register_script('jquery', ('https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js'), false, '3.7.1'); + wp_register_script('jquery-ui', ('https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js'), array('jquery'), '1.13.2'); + wp_enqueue_script('jquery-ui'); +} + +show_admin_bar(false); +add_editor_style(); + +remove_action('wp_head', 'rsd_link'); +remove_action('wp_head', 'wp_generator'); +remove_action('wp_head', 'index_rel_link'); +remove_action('wp_head', 'wlwmanifest_link'); +remove_action('wp_head', 'start_post_rel_link', 10, 0); +remove_action('wp_head', 'parent_post_rel_link', 10, 0); +remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0); +automatic_feed_links(false); + +if ( class_exists("global_posts_ordering") ) { + $global_posts_ordering = new global_posts_ordering(array("product")); +} + + +function image_src($img_tag) +{ + preg_match("/src=\"(.*?)\"/i", $img_tag, $matches); + return $matches[1]; +} + +function short_text($text, $len=200, $puncte = ""){ +$text = strip_tags($text); +if( (mb_strlen($text) > $len) ) { + $whitespaceposition = mb_strpos($text," ",$len)-1; + if( $whitespaceposition > 0 ) { + $chars = count_chars(mb_substr($text, 0, ($whitespaceposition+1)), 1); + if (isset($chars[ord('<')]) && $chars[ord('<')] > (isset($chars[ord('>')]) ? $chars[ord('>')] : 0)) + $whitespaceposition = mb_strpos($text,">",$whitespaceposition)-1; + $text = mb_substr($text, 0, ($whitespaceposition+1)); + } + // close unclosed html tags + if( preg_match_all("|<([a-zA-Z]+)|",$text,$aBuffer) ) { + if( !empty($aBuffer[1]) ) { + preg_match_all("||",$text,$aBuffer2); + if( count($aBuffer[1]) != count($aBuffer2[1]) ) { + foreach( $aBuffer[1] as $index => $tag ) { + if( empty($aBuffer2[1][$index]) || $aBuffer2[1][$index] != $tag) + $text .= ''; + } + } + } + } +} +return $text.$puncte; +} + +/* + returneaza data in format: + - pt postare de azi 'azi la {ora}' + - pt anul asta, dar nu azi '{ziua} {luna} la {ora} + - pt alt an '{ziua} {luna} {anul} la {ora} +*/ +function afiseaza_data($data=false) +{ + if (!$data) return false; + // verifica daca este data in format corect + if (($data_timestamp = strtotime($data)) === false) { + // daca nu este corecta si nu am ce face cu ea returnez valoarea inapoi + return $data; + } + else { + //@setlocale(LC_TIME, 'ro_RO'); + /*if (date("Y")==date("Y",$data_timestamp)) { + // acelasi an + + if (date('d')==date('d',$data_timestamp)) { + // aceeasi zi + return strftime('azi la %H:%M',$data_timestamp); + } + else + { + // zi diferite + return strftime('%d %b la %H:%M',$data_timestamp); + } + } + else { + // ani diferiti + return strftime('%d %b %Y la %H:%M',$data_timestamp); + }*/ + return strftime("%b %d",$data_timestamp); + } +} + +function afiseaza_data_cu_an($data=false) +{ + if (!$data) return false; + // verifica daca este data in format corect + if (($data_timestamp = strtotime($data)) === false) { + // daca nu este corecta si nu am ce face cu ea returnez valoarea inapoi + return $data; + } + else { + //@setlocale(LC_TIME, 'ro_RO'); + /*if (date("Y")==date("Y",$data_timestamp)) { + // acelasi an + + if (date('d')==date('d',$data_timestamp)) { + // aceeasi zi + return strftime('azi la %H:%M',$data_timestamp); + } + else + { + // zi diferite + return strftime('%d %b la %H:%M',$data_timestamp); + } + } + else { + // ani diferiti + return strftime('%d %b %Y la %H:%M',$data_timestamp); + }*/ + return strftime("%b %d, %Y",$data_timestamp); + } +} + +function arrangeMenuIqon($menu, $selected_object_id = 0, $selected_object_type, $homeID) { + global $object_id, $object_id_child, $object_id_child_child; + $arranged_menu = array(); + $mainLevel = array(); + $secondLevel = array(); + $thirdLevel = array(); + foreach ($menu as $m) + if ($m->menu_item_parent == 0) { + $key = $m->ID; + $arranged_menu[$key] = new stdClass; + $arranged_menu[$key]->ID = $m->ID; + $arranged_menu[$key]->object_id = $m->object_id; + $arranged_menu[$key]->object_id_en = function_exists('icl_object_id') ? icl_object_id($m->object_id, $m->object, true, 'en') : $m->object_id; + $arranged_menu[$key]->parrent = 0; + $arranged_menu[$key]->title = $m->title; + $arranged_menu[$key]->attr_title = $m->attr_title; + $arranged_menu[$key]->object = $m->object; + if (empty($arranged_menu[$key]->attr_title)) $arranged_menu[$key]->attr_title = $arranged_menu[$key]->title; + $arranged_menu[$key]->url = $m->url; + $arranged_menu[$key]->has_childrens = false; + $arranged_menu[$key]->selected = false; + if ($selected_object_type == 'home') { + if ($selected_object_id == $arranged_menu[$key]->object_id_en && $m->object == 'page') + $arranged_menu[$key]->selected = true; + $object_id = $key; + } + elseif ($selected_object_type == $m->object && $selected_object_id == $m->object_id) { + $arranged_menu[$key]->selected = true; + $object_id = $key; + } + $mainLevel[] = $m->ID; + } + elseif (in_array($m->menu_item_parent, $mainLevel)) { + $key_parent = $m->menu_item_parent; + $arranged_menu[$key_parent]->has_childrens = true; + $key_child = $m->ID; + $objectToModify = &$arranged_menu[$key_parent]->childrens; + $objectToModify[$key_child] = new stdClass; + $objectToModify[$key_child]->ID = $m->ID; + $objectToModify[$key_child]->object_id = $m->object_id; + $objectToModify[$key_child]->object_id_en = function_exists('icl_object_id') ? icl_object_id($m->object_id, $m->object, true, 'en') : $m->object_id; + $objectToModify[$key_child]->parrent = $key_parent; + $objectToModify[$key_child]->title = $m->title; + $objectToModify[$key_child]->attr_title = $m->attr_title; + $objectToModify[$key_child]->object = $m->object; + if (empty($objectToModify[$key_child]->attr_title)) $objectToModify[$key_child]->attr_title = $objectToModify[$key_child]->title; + $objectToModify[$key_child]->url = $m->url; + if (($arranged_menu[$key_parent]->object_id_en == 8) && sizeof($arranged_menu[$key_parent]->childrens) == 1) $arranged_menu[$key_parent]->url = $objectToModify[$key_child]->url; + $objectToModify[$key_child]->selected = false; + if ($selected_object_type == $m->object && $selected_object_id == $m->object_id) { + $objectToModify[$key_child]->selected = true; + $arranged_menu[$key_parent]->selected = true; + $object_id = $key_parent; + $object_id_child = $key_child; + } + $objectToModify[$key_child]->has_childrens = false; + $secondLevel[] = $m->ID; + if ($arranged_menu[$key_parent]->object_id_en == 8) { + wp_reset_query(); + $args_pages = array('post_type' => 'page', 'order' => 'ASC', 'orderby' => 'menu_order', 'post_status' => 'publish', 'nopaging' => true, 'post_parent' => $objectToModify[$key_child]->object_id); + $pages = query_posts($args_pages); + //dv($pages); + if ($pages) { + $objectToModifyChild = &$objectToModify[$key_child]->childrens; + $objectToModify[$key_child]->has_childrens = true; + foreach ($pages as $p) { + $key_child_child = $p->ID; + $objectToModifyChild[$key_child_child] = new stdClass; + $objectToModifyChild[$key_child_child]->ID = $p->ID; + $objectToModifyChild[$key_child_child]->object_id = $p->ID; + $objectToModifyChild[$key_child_child]->object_id_en = function_exists('icl_object_id') ? icl_object_id($p->ID, $p->post_type, true, 'en') : $p->ID; + $objectToModifyChild[$key_child_child]->parrent = $key_child; + $objectToModifyChild[$key_child_child]->title = $p->post_title; + $objectToModifyChild[$key_child_child]->attr_title = $p->post_title; + $objectToModifyChild[$key_child_child]->object = $p->post_type; + $objectToModifyChild[$key_child_child]->url = get_permalink($p->ID); + $objectToModifyChild[$key_child_child]->selected = false; + if ($selected_object_type == $p->post_type && $selected_object_id == $p->ID) { + $objectToModifyChild[$key_child_child]->selected = true; + $objectToModify[$key_child]->selected = true; + $arranged_menu[$key_parent]->selected = true; + $object_id = $key_parent; + $object_id_child = $key_child; + $object_id_child_child = $key_child_child; + } + $objectToModifyChild[$key_child_child]->has_childrens = false; + } + + } + wp_reset_query(); + } + unset($objectToModify); + } + + return $arranged_menu; +} + +function arrangeMenu($menu, $selected_object_id = 0, $selected_object_type, $homeID) { + global $object_id, $object_id_child, $object_id_child_child; + $arranged_menu = array(); + + // get level 1 menus + foreach ($menu as $m) + if ($m->menu_item_parent == 0) { + $i = $m->ID; + $arranged_menu[$i] = new stdClass; + $arranged_menu[$i]->ID = $m->ID; + $arranged_menu[$i]->object_id = $m->object_id; + $arranged_menu[$i]->title = $m->title; + $arranged_menu[$i]->attr_title = $m->attr_title; + if (empty($arranged_menu[$i]->attr_title)) $arranged_menu[$i]->attr_title = $arranged_menu[$i]->title; + $arranged_menu[$i]->parrent = 0; + $arranged_menu[$i]->url = $m->url; + $arranged_menu[$i]->selected = false; + if ($selected_object_id == $m->object_id) { + $object_id = $i; + $arranged_menu[$i]->selected = true; + } + $arranged_menu[$i]->has_childrens = false; + } + + if ($selected_object_type == 'home') $arranged_menu[$homeID]->selected = true; + return $arranged_menu; +} + +function dv($var, $var_type = '') { + dump_var($var, $var_type); +} + +function dump_var($var, $var_type = '') { + $ip=$_SERVER['REMOTE_ADDR']; + $local=false; + //if(preg_match("/192\.168\.([0-9]+)\.([0-9]+)/", $ip))$local=true; + //if(preg_match("/10\.([0-9]+)\.([0-9]+)\.([0-9]+)/", $ip))$local=true; + if($ip == "89.36.30.26") $local=true; + $local=true; + $rand = rand(0,9999); + echo "
"; + if($local==true) { + print_var($var, $var_type); + } + echo "
"; + +} +function print_var(&$var, $var_type, $return=false) +{ + + global $html; + $html=" + +
"; + + if(!isset($var))$var="%NULL%"; + + $old = $var; + $var = '0unique'.rand().'value'; + $var_name = array_search($var, $GLOBALS, true); + $var=$old; + if($var_name) { + print_content($var, "$".$var_name, 1, "$".$var_name); + } else { + print_content($var, $var_type, 1, $var_type); + } + + $html.="
"; + + if($return)return $html; + else echo $html; +} + +function print_content($var, $var_name, $level, $parent) { + if(!isset($var))$var="%NULL%"; + global $html; + for($i=0;$i<$level;$i++)$html.="     "; + + if(strpos($var_name, "$")===0) { + $html.="$var_name = "; + } elseif(strpos($parent, "->$var_name")==strlen($parent)-strlen($var_name)-2) { + $html.="->$var_name = "; + } else { + $html.="["; + if(is_numeric($var_name)) { + $html.="$var_name"; + } else { + $html.="\"$var_name\""; + } + $html.="] = "; + } + + + if(is_array($var)) { + $id=base64_encode(microtime()); + $html.=" Array {
"; + $html.="
"; + foreach ($var as $k=>$v) { + print_content($v, $k, $level+1, $parent."['$k']"); + } + $html.="
"; + for($i=0;$i<$level;$i++)$html.="     "; + $html.=" }
"; + } elseif(is_object($var)) { + $id=base64_encode(microtime()); + $html.=" Object {
"; + $html.="
"; + foreach ($var as $k=>$v) { + print_content($v, $k, $level+1, $parent."->$k"); + } + $html.="
"; + for($i=0;$i<$level;$i++)$html.="     "; + $html.=" }
"; + } else { + if (is_string($var)) { + $var=htmlentities($var, ENT_QUOTES, "UTF-8"); + } + if(is_numeric($var)) { + $html.="$var;
"; + } elseif($var=="%NULL%") { + $html.="NULL;
"; + } else { + $html.="\"$var\";
"; + } + + } +} + +function fileVersion($filename) { + //check if the file exists + if (file_exists($filename)) { + // return the time the file was last modified + echo filemtime($filename); + } else { + // let them know the file wasn't found + echo 'FileNotFound'; + } +} + +// IQON legacy live hardening, 2026-05-20. +function iqon_legacy_security_headers() { + if (headers_sent()) return; + header("X-Content-Type-Options: nosniff"); + header("X-Frame-Options: SAMEORIGIN"); + header("Referrer-Policy: strict-origin-when-cross-origin"); + header("Permissions-Policy: camera=(), microphone=(), geolocation=()"); +} +add_action("send_headers", "iqon_legacy_security_headers", 100); + +add_filter("xmlrpc_enabled", "__return_false"); + +function iqon_legacy_restrict_rest_users($endpoints) { + if (isset($endpoints["/wp/v2/users"])) unset($endpoints["/wp/v2/users"]); + if (isset($endpoints["/wp/v2/users/(?P[\\d]+)"])) unset($endpoints["/wp/v2/users/(?P[\\d]+)"]); + return $endpoints; +} +add_filter("rest_endpoints", "iqon_legacy_restrict_rest_users", 20); + +function iqon_legacy_site_name($name = "") { + return "IQON"; +} +add_filter("wpseo_opengraph_site_name", "iqon_legacy_site_name", 20); + +function iqon_legacy_title($title) { + if (function_exists("is_front_page") && is_front_page()) return "IQON | IT Strategy and Transformation Consulting"; + return $title; +} +add_filter("wpseo_title", "iqon_legacy_title", 20); +add_filter("wpseo_opengraph_title", "iqon_legacy_title", 20); + +function iqon_legacy_metadesc($description) { + if (function_exists("is_front_page") && is_front_page()) return "IQON helps organizations align IT strategy, transformation programs, and governance with measurable business outcomes."; + return $description; +} +add_filter("wpseo_metadesc", "iqon_legacy_metadesc", 20); +add_filter("wpseo_opengraph_desc", "iqon_legacy_metadesc", 20); + +function iqon_legacy_https_url($value) { + if (!is_string($value)) return $value; + return str_replace( + array("http://www.iqon.com", "http://iqon.com", "http://maps.google.com", "http://maps.googleapis.com", "http:\\/\\/www.iqon.com", "http:\\/\\/iqon.com", "http:\\/\\/maps.google.com", "http:\\/\\/maps.googleapis.com", "\"name\":\"- IQON\"", "property=\"og:title\" content=\"How’s business?\"", "\"name\":\"How’s business?\""), + array("https://www.iqon.com", "https://iqon.com", "https://maps.google.com", "https://maps.googleapis.com", "https:\\/\\/www.iqon.com", "https:\\/\\/iqon.com", "https:\\/\\/maps.google.com", "https:\\/\\/maps.googleapis.com", "\"name\":\"IQON\"", "property=\"og:title\" content=\"IQON | IT Strategy and Transformation Consulting\"", "\"name\":\"IQON | IT Strategy and Transformation Consulting\""), + $value + ); +} +add_filter("wpseo_opengraph_image", "iqon_legacy_https_url", 20); + +function iqon_legacy_rewrite_recursive_urls($data) { + if (is_string($data)) return iqon_legacy_https_url($data); + if (is_array($data)) { + foreach ($data as $key => $value) $data[$key] = iqon_legacy_rewrite_recursive_urls($value); + } + return $data; +} +add_filter("wpseo_json_ld_output", "iqon_legacy_rewrite_recursive_urls", 20); + +function iqon_legacy_output_buffer_start() { + if (is_admin()) return; + ob_start("iqon_legacy_https_url"); +} +add_action("template_redirect", "iqon_legacy_output_buffer_start", 0); +?> diff --git a/deploy/legacy-wordpress-2026-05-20/theme/header.php b/deploy/legacy-wordpress-2026-05-20/theme/header.php new file mode 100644 index 0000000..0632bdf --- /dev/null +++ b/deploy/legacy-wordpress-2026-05-20/theme/header.php @@ -0,0 +1,139 @@ + +name; + $selected_object_id = get_term_by('id', $selected_object_id, 'category')->parent; + } +} +else if (is_single()) { + $ascunde_services = true; + if (get_queried_object()->post_type == 'post') { + $taxonomy = get_the_terms(get_the_ID(),'category'); + $selected_object_type = 'category'; + $title_bread = get_queried_object()->post_title; + if ($taxonomy[1]->term_id == 1) $selected_object_id = 1; + else { + $pas = 0; + foreach ($taxonomy as $tax) { + $pas++; + if ($pas==1) { + $selected_object_id = $tax->term_id; + } + else { + $selected_department = $tax->term_id; + $selected_department_name = $tax->name; + } + } + } + } +} +else if (is_search()) { + +} +?> + + + + + +<?php wp_title('«', true, 'right'); ?> <?php bloginfo('name'); ?> | <?php bloginfo('description'); ?> + + + + + + + + + + +
+
+ + + +
+ + IQON + +
+ + +
+ +
+ IQON +
+ + + + + + +
+ +
diff --git a/reports/legacy-selected-steps-2026-05-20.md b/reports/legacy-selected-steps-2026-05-20.md new file mode 100644 index 0000000..855d718 --- /dev/null +++ b/reports/legacy-selected-steps-2026-05-20.md @@ -0,0 +1,53 @@ +# IQON legacy selected steps live patch + +Purpose: record the live implementation of selected old-design steps 2, 3, 4, 6, and 8 for `iqon.com`. + +Created: 2026-05-20 +Updated: 2026-05-20 + +## Scope + +Selected items implemented: + +1. Hardening old WordPress. +2. Mobile fix. +3. SEO cleanup. +4. Contacts cleanup. +5. Verification. + +Out of scope: + +1. Replacing the old apex design. +2. Deleting WordPress files. +3. Moving the new `www.iqon.com` redesign. + +## Live files uploaded + +| Local artifact | Remote target | +|---|---| +| `deploy/legacy-wordpress-2026-05-20/.htaccess` | `www/iqon.com/.htaccess` | +| `deploy/legacy-wordpress-2026-05-20/theme/functions.php` | `www/iqon.com/wp-content/themes/iqon/functions.php` | +| `deploy/legacy-wordpress-2026-05-20/theme/header.php` | `www/iqon.com/wp-content/themes/iqon/header.php` | +| `deploy/legacy-wordpress-2026-05-20/theme/footer.php` | `www/iqon.com/wp-content/themes/iqon/footer.php` | +| `deploy/legacy-wordpress-2026-05-20/theme/contactkz.php` | `www/iqon.com/wp-content/themes/iqon/contactkz.php` | +| `deploy/legacy-wordpress-2026-05-20/theme/css/style.css` | `www/iqon.com/wp-content/themes/iqon/css/style.css` | + +## Verification + +`COMPLETED` with live checks on 2026-05-20. + +Evidence: + +1. `scripts/iqon-phase1-verify.sh https://iqon.com` returned `[OK] iqon Phase 1 verification passed for https://iqon.com`. +2. Apex homepage contains old WordPress markers and hardening markers: `viewport`, `skip-link`, `wp-content/themes/iqon`, `og:site_name=IQON`. +3. Apex homepage JSON-LD no longer exposes `http://www.iqon.com` image URLs. +4. `https://iqon.com/contact/` resolves to old WordPress contact page, not static redesign contact. +5. Contact page contains `office@iqon.com` and `@infobidgebot`. +6. Contact page check did not match obsolete `office@iqon.kz`, old phone, old fax, Moscow, or Almaty phone patterns. +7. `https://www.iqon.com/` still contains new redesign markers: `theme-color #09090b`, `topbar`, `hero-cloud`. + +## Residual risks + +1. Local PHP CLI was unavailable, so PHP syntax verification could not run locally. +2. Contact form delivery was not submitted, so mail transport remains unverified. +3. The old WordPress database archive status remains unresolved.