/** * پیدا کردن شاخص CPI برای سال و ماه مشخص * * منطق جدید: * 1. جستجوی شاخص ماهیانه با کلید عددی (مثلاً "1"، "01"). * 2. اگر شاخص ماهیانه پیدا نشد ولی کلید "average" وجود داشت، همان average را برمی‌گرداند. * 3. در ساختارهای ردیفی (آرایه‌ای) نیز در صورت نبود ماه، اگر average باشد، به عنوان جایگزین استفاده می‌شود. */ function ghlt_find_cpi_index($year, $month) { $year = (string) ((int) ghlt_sanitize_year_month($year)); $month = (string) ((int) ghlt_sanitize_year_month($month)); if ($year === '0' || $month === '0') { return null; } $data = ghlt_get_cpi_data(); // --- حالت اول: ساختار «سال => آرایه ماه‌ها» if (isset($data[$year]) && is_array($data[$year])) { $yearRow = $data[$year]; // 1) تلاش برای پیدا کردن شاخص ماهیانه if (isset($yearRow[$month])) { return ghlt_extract_cpi_value($yearRow[$month]); } $month_padded = str_pad($month, 2, '0', STR_PAD_LEFT); if (isset($yearRow[$month_padded])) { return ghlt_extract_cpi_value($yearRow[$month_padded]); } // 2) اگر ماه پیدا نشد، ولی average تعریف شده است، از average استفاده کن if (isset($yearRow['average'])) { return ghlt_extract_cpi_value($yearRow['average']); } } // --- حالت دوم: ساختار «سال => ماه‌ها» با کلیدهای غیر استاندارد عددی foreach ($data as $row_year => $months) { if ((string) ((int) $row_year) === $year && is_array($months)) { $foundMonthly = false; foreach ($months as $row_month => $value) { // فقط ماه‌هایی که قابل تبدیل به عدد هستند $row_month_num = (string) ((int) ghlt_sanitize_year_month($row_month)); if ($row_month_num === $month) { $foundMonthly = true; return ghlt_extract_cpi_value($value); } } // اگر هیچ ماه عددی معتبر پیدا نشد، ولی average وجود دارد if (!$foundMonthly && isset($months['average'])) { return ghlt_extract_cpi_value($months['average']); } } } // --- حالت سوم: ساختار ردیفی {year: .., month: .., value: ..} یا مشابه آن foreach ($data as $row) { if (!is_array($row)) { continue; } $row_year = null; $row_month = null; $average = null; $value = null; foreach (array('year', 'سال', 'y') as $key) { if (isset($row[$key])) { $row_year = (string) ((int) ghlt_sanitize_year_month($row[$key])); break; } } foreach (array('month', 'ماه', 'm') as $key) { if (isset($row[$key])) { $row_month = (string) ((int) ghlt_sanitize_year_month($row[$key])); break; } } // استخراج مقدار شاخص (value یا average) foreach (array('value', 'شاخص', 'index', 'cpi') as $key) { if (isset($row[$key])) { $value = $row[$key]; break; } } if (isset($row['average'])) { $average = $row['average']; } // اگر year و month هر دو مشخص و برابر ورودی باشند → مقدار همان ماه if ($row_year === $year && $row_month === $month && $value !== null) { return ghlt_extract_cpi_value($value); } // اگر year برابر است ولی month تعریف نشده/نمی‌خواند و average موجود است → average if ($row_year === $year && $row_month === null && $average !== null) { return ghlt_extract_cpi_value($average); } } // اگر هیچ چیز پیدا نشد return null; } نکات مهم این نسخه: - اگر برای سالی مثل $1356$ فقط `average` وجود داشت و ماه واردی هر عددی باشد، شاخص آن سال با مقدار `average` ($9.0$) استفاده می‌شود و دیگر پیام «شاخص مبنا/شروع یافت نشد» نخواهید داشت. - در ساختارهای ردیفی نیز اگر ماه خالی باشد اما `average` موجود باشد، از همان استفاده می‌کند. --- ### ۳. بررسی و اصلاح خطای ارث («خطا در اعتبارسنجی فرم») در تصویر سوم، پیام قرمز «خطا در اعتبارسنجی فرم.» نشان می‌دهد که یا: - `nonce` درست ساخته و ارسال نشده، - یا نام فیلد `nonce` در فرم با نام بررسی‌شده در `renderInheritanceCalculator()` هماهنگ نیست، - یا اکشن فرم (`ghlt_inheritance_action`) با شرط داخل تابع اختلاف دارد. نسخه‌ای که در پیام قبلی دادم (کلاس `GHLT_Inheritance_Engine`) از این منطق استفاده می‌کند: php if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['ghlt_inheritance_action'] ?? '') === 'calculate' ) { if (! wp_verify_nonce( sanitize_text_field(wp_unslash($_POST['ghlt_inheritance_nonce_field'] ?? '')), 'ghlt_inheritance_nonce' ) ) { $res = ['success' => false, 'errors' => ['خطا در اعتبارسنجی فرم.']]; } else { ... } } و در فرم: php