ID)!='auto-draft'&&empty($typ_inzeratu)){echo ' '.__('Toto pole je povinné.','financni-inzerce').' ';}?> | |
ID)!='auto-draft'&&empty($delka)){echo ' '.__('Toto pole je povinné.','financni-inzerce').' ';}?> | |
" name="< php echo esc_attr(META_JMENO); >" value="< php echo esc_attr( $jmeno ); >"/> | |
" name="< php echo esc_attr(META_EMAIL); >" value="< php echo esc_attr( $email ); >">" name="< php echo esc_attr(META_TELEFON); >" value="< php echo esc_attr( $telefon ); >"/> | |
" name="< php echo esc_attr(META_SAZBA); >" value="< php echo esc_attr( $sazba ); >">'sanitize_text_field',META_EMAIL=>'sanitize_email',META_TELEFON=>'sanitize_text_field',META_TYP_PRODUKTU=>'sanitize_text_field',META_SAZBA=>'sanitize_text_field',META_DELKA=>'intval',META_TYP_INZERATU=>'sanitize_key',]; foreach($fields_to_process as $meta_key=>$sanitize_callback){if(isset($_POST[$meta_key])){$raw_value=$_POST[$meta_key];$sanitized_value=call_user_func($sanitize_callback,$raw_value);$is_valid=true;if($meta_key===META_TYP_INZERATU){if(empty($sanitized_value)||!in_array($sanitized_value,VALID_TYP_INZERATU_OPTIONS)){$is_valid=false;}}elseif($meta_key===META_DELKA){if(!in_array($sanitized_value,VALID_DELKA_OPTIONS)){$is_valid=false;}}if($is_valid&&($sanitized_value||$sanitized_value===0||$sanitized_value==='0')){update_post_meta($post_id,$meta_key,$sanitized_value);}else{delete_post_meta($post_id,$meta_key);}}else{delete_post_meta($post_id,$meta_key);}} } add_action( 'save_post_financni_inzerat', 'financni_inzerce_save_meta_box_data' ); // ============================================================================= // 3. Shortcode [pridat_financni_inzerat] - Formulář pro přidání // ============================================================================= function financni_inzerce_sidebar_form_shortcode() { $success_message = ''; $error_messages = []; if ( isset( $_POST['financni_inzerce_submit_sidebar'] ) ) { if ( !isset($_POST['financni_inzerce_sidebar_nonce']) || !wp_verify_nonce($_POST['financni_inzerce_sidebar_nonce'], 'financni_inzerce_add_sidebar') ) { $error_messages[] = __('Chyba zabezpečení formuláře.', 'financni-inzerce'); } if ( !is_user_logged_in() ) { $error_messages[] = __('Pro přidání inzerátu se musíte přihlásit.', 'financni-inzerce'); } else { $user_id = get_current_user_id(); $status = get_user_meta( $user_id, FINANCNI_INZERCE_USER_STATUS, true ); if ( $status !== 'approved' ) { $error_messages[] = __( 'Váš účet není aktivní nebo ještě nebyl schválen administrátorem. Nemůžete přidávat inzeráty.', 'financni-inzerce' ); } if ( empty($error_messages) && isset($_POST[META_TYP_INZERATU]) && $_POST[META_TYP_INZERATU] === 'nabidka' ) { $user_ico = get_user_meta($user_id, FINANCNI_INZERCE_USER_ICO, true); if ( empty($user_ico) ) { $profile_url = get_edit_user_link($user_id); $error_messages[] = sprintf( __('Pro vložení nabídky musíte mít ve svém profilu vyplněné platné IČO. Upravit profil.', 'financni-inzerce'), esc_url($profile_url) ); } } } if ( empty($error_messages) ) { if ( empty( trim($_POST['inzerat_title']) ) ) { $error_messages[] = __('Název inzerátu je povinný.', 'financni-inzerce'); } if ( empty( $_POST[META_TYP_INZERATU] ) || ! in_array( $_POST[META_TYP_INZERATU], VALID_TYP_INZERATU_OPTIONS ) ) { $error_messages[] = __('Musíte zvolit platný typ inzerátu (Nabídka/Poptávka).', 'financni-inzerce'); } if ( empty( $_POST[META_DELKA] ) || ! in_array( intval($_POST[META_DELKA]), VALID_DELKA_OPTIONS ) ) { $error_messages[] = __('Musíte zvolit platnou délku zobrazení.', 'financni-inzerce'); } if ( ! empty( $_POST[META_EMAIL] ) && ! is_email( $_POST[META_EMAIL] ) ) { $error_messages[] = __('Zadaný kontaktní email není platný.', 'financni-inzerce'); } } if ( empty( $error_messages ) ) { $title = sanitize_text_field( $_POST['inzerat_title'] ); $content = wp_kses_post( $_POST['inzerat_content'] ); $jmeno = sanitize_text_field( $_POST[META_JMENO] ); $email = sanitize_email( $_POST[META_EMAIL] ); $telefon = sanitize_text_field( $_POST[META_TELEFON] ); $typ_produktu = sanitize_text_field( $_POST[META_TYP_PRODUKTU] ); $sazba = sanitize_text_field( $_POST[META_SAZBA] ); $delka = intval( $_POST[META_DELKA] ); $typ_inzeratu = sanitize_key($_POST[META_TYP_INZERATU]); $post_data = [ 'post_title' => $title, 'post_content' => $content, 'post_type' => 'financni_inzerat', 'post_status' => 'pending', 'post_author' => get_current_user_id() ]; $new_post_id = wp_insert_post( $post_data, true ); if ( !is_wp_error( $new_post_id ) ) { update_post_meta( $new_post_id, META_JMENO, $jmeno ); update_post_meta( $new_post_id, META_EMAIL, $email ); update_post_meta( $new_post_id, META_TELEFON, $telefon ); update_post_meta( $new_post_id, META_TYP_PRODUKTU, $typ_produktu ); update_post_meta( $new_post_id, META_SAZBA, $sazba ); update_post_meta( $new_post_id, META_DELKA, $delka ); update_post_meta( $new_post_id, META_TYP_INZERATU, $typ_inzeratu ); $success_message = __( 'Váš inzerát byl úspěšně odeslán ke schválení administrátorem.', 'financni-inzerce' ); $admin_email = get_option( 'admin_email' ); if ( $admin_email ) { $post_title_for_email = get_the_title($new_post_id); $subject = sprintf( __('[%s] Nový inzerát "%s" čeká na schválení', 'financni-inzerce' ), get_bloginfo('name'), $post_title_for_email ); $edit_link = admin_url( 'post.php?post=' . $new_post_id . '&action=edit' ); $author_info = get_userdata(get_current_user_id()); $typ_inzeratu_text = ($typ_inzeratu == 'nabidka' ? __('Nabídka', 'financni-inzerce') : __('Poptávka', 'financni-inzerce')); $message = sprintf( __( 'Nový finanční inzerát "%s" (%s) byl přidán uživatelem %s a čeká na Vaše schválení.', 'financni-inzerce' ), esc_html($post_title_for_email), esc_html($typ_inzeratu_text), ($author_info ? esc_html($author_info->display_name) : __('Neznámý', 'financni-inzerce')) ); $message .= "\r\n\r\n" . __( 'Odkaz pro úpravu a schválení:', 'financni-inzerce' ) . "\r\n" . esc_url($edit_link) . "\r\n"; $headers = ['Content-Type: text/plain; charset=UTF-8']; wp_mail( $admin_email, $subject, $message, $headers ); } $_POST = []; } else { $error_messages[] = __( 'Došlo k chybě při ukládání inzerátu.', 'financni-inzerce' ); $error_messages[] = $new_post_id->get_error_message(); } } } ob_start(); $post_data=!empty($_POST)?$_POST:[];$prev_typ_inzeratu=isset($post_data[META_TYP_INZERATU])?$post_data[META_TYP_INZERATU]:'';$prev_title=isset($post_data['inzerat_title'])?esc_attr($post_data['inzerat_title']):'';$prev_content=isset($post_data['inzerat_content'])?esc_textarea($post_data['inzerat_content']):'';$prev_jmeno=isset($post_data[META_JMENO])?esc_attr($post_data[META_JMENO]):'';$prev_email=isset($post_data[META_EMAIL])?esc_attr($post_data[META_EMAIL]):'';$prev_telefon=isset($post_data[META_TELEFON])?esc_attr($post_data[META_TELEFON]):'';$prev_typ_produktu=isset($post_data[META_TYP_PRODUKTU])?$post_data[META_TYP_PRODUKTU]:'';$prev_sazba=isset($post_data[META_SAZBA])?esc_attr($post_data[META_SAZBA]):'';$prev_delka=isset($post_data[META_DELKA])?$post_data[META_DELKA]:''; ?> '.esc_html($success_message).' |
'.get_the_title().'
';$output.=' ';$output.=''.__('Aktuálně zde nejsou žádné inzeráty odpovídající zadaným kritériím.','financni-inzerce').'
';} return $output;} if(!shortcode_exists('zobrazit_financni_inzeraty')){add_shortcode('zobrazit_financni_inzeraty','financni_inzerce_display_shortcode');} // ============================================================================= // 5. Zobrazení Detailů Inzerátu (the_content filtr) // ============================================================================= function financni_inzerce_display_details_in_content($content){if(is_singular('financni_inzerat')&&in_the_loop()&&is_main_query()){global $post;$post_id=$post->ID;$expirace_ts_check=get_post_meta($post_id,META_EXPIRACE_TS,true);if($expirace_ts_check&&$expirace_ts_check<=current_time('timestamp',true)){return ' ';}$details_html=''.__('Detaily inzerátu','financni-inzerce').'
';$details_html.='- '.__('Typ inzerátu:','financni-inzerce').' '.esc_html(($typ_inzeratu=='nabidka'?__('Nabídka','financni-inzerce'):__('Poptávka','financni-inzerce'))).'
- '.__('Typ produktu:','financni-inzerce').' '.esc_html(ucfirst($typ_produktu)).'
- '.__('Sazba/Popis:','financni-inzerce').' '.esc_html($sazba).'
- '.__('Platnost do:','financni-inzerce').' '.date_i18n(get_option('date_format'),$expirace_ts).'
- '.__('Vložil:','financni-inzerce').' '.esc_html($author_name).'
'.__('Kontaktní údaje','financni-inzerce').'
';$details_html.='- '.__('Kontakt:','financni-inzerce').' '.esc_html($jmeno).'
- '.__('Email:','financni-inzerce').' '.esc_html($email).'
- '.__('Telefon:','financni-inzerce').' '.esc_html($telefon).'
- '.__('Kontaktní údaje nebyly zadány.','financni-inzerce').'
';return $details_html.$content;}return $content;} add_filter('the_content','financni_inzerce_display_details_in_content',20); // ============================================================================= // 6. Nastavení Expirace Inzerátu při Publikaci / Změně Statusu // ============================================================================= function financni_inzerce_set_update_expiration($new_status,$old_status,$post){if(!$post instanceof WP_Post){if(isset($_POST['post_ID'])){$post=get_post($_POST['post_ID']);if(!$post)return;}else{return;}}if($post->post_type==='financni_inzerat'){if($new_status==='publish'&&$old_status!=='publish'){$delka_dny=get_post_meta($post->ID,META_DELKA,true);if(!empty($delka_dny)&&is_numeric($delka_dny)&&in_array($delka_dny,VALID_DELKA_OPTIONS)){$publish_time_gmt=strtotime($post->post_date_gmt);$now_gmt=current_time('timestamp',true);$base_time_gmt=($publish_time_gmt>$now_gmt)?$publish_time_gmt:$now_gmt;$expirace_ts=$base_time_gmt+(intval($delka_dny)*DAY_IN_SECONDS);update_post_meta($post->ID,META_EXPIRACE_TS,$expirace_ts);delete_post_meta($post->ID,META_NOTIF_SENT);}else{delete_post_meta($post->ID,META_EXPIRACE_TS);delete_post_meta($post->ID,META_NOTIF_SENT);}}}} add_action('transition_post_status','financni_inzerce_set_update_expiration',10,3); // ============================================================================= // 7. Kontrola Expirace a Notifikace (WP-Cron) // ============================================================================= if(!wp_next_scheduled(EXPIRATION_CRON_HOOK)){wp_schedule_event(strtotime('today 2:00am'),'daily',EXPIRATION_CRON_HOOK);} function financni_inzerce_check_expired_ads(){$now_gmt=current_time('timestamp',true);$three_days_from_now_gmt=$now_gmt+(3*DAY_IN_SECONDS);$args_notify=['post_type'=>'financni_inzerat','post_status'=>'publish','posts_per_page'=>-1,'meta_query'=>['relation'=>'AND',['key'=>META_EXPIRACE_TS,'compare'=>'EXISTS'],['key'=>META_EXPIRACE_TS,'value'=>$now_gmt,'compare'=>'>','type'=>'NUMERIC'],['key'=>META_EXPIRACE_TS,'value'=>$three_days_from_now_gmt,'compare'=>'<=','type'=>'NUMERIC'],['key'=>META_NOTIF_SENT,'compare'=>'NOT EXISTS'],],'fields'=>'ids',];$ads_to_notify=get_posts($args_notify);foreach($ads_to_notify as $post_id){$kontakt_email=get_post_meta($post_id,META_EMAIL,true);$author_id=get_post_field('post_author',$post_id);$author_info=get_userdata($author_id);$author_email=$author_info?$author_info->user_email:null;$target_email=(!empty($kontakt_email)&&is_email($kontakt_email))?$kontakt_email:((!empty($author_email)&&is_email($author_email))?$author_email:null);if($target_email){$post_title=get_the_title($post_id);$expirace_ts=get_post_meta($post_id,META_EXPIRACE_TS,true);$expirace_datum=date_i18n(get_option('date_format').' '.get_option('time_format'),$expirace_ts+(get_option('gmt_offset')*HOUR_IN_SECONDS));$subject=sprintf(__('[%s] Váš inzerát "%s" brzy expiruje','financni-inzerce'),get_bloginfo('name'),$post_title);$message=sprintf(__('Dobrý den,','financni-inzerce'))."\r\n\r\n";$message.=sprintf(__('Váš finanční inzerát "%s" na webu %s brzy expiruje.','financni-inzerce'),$post_title,get_bloginfo('name'))."\r\n";$message.=sprintf(__('Datum expirace: %s','financni-inzerce'),$expirace_datum)."\r\n\r\n";$message.=__('Pokud chcete inzerát prodloužit, můžete jej upravit a znovu publikovat.')."\r\n";if(financni_user_can_edit_own_ad($author_id,$post_id)){$edit_link=get_edit_post_link($post_id,'');if($edit_link){$message.="\r\n".__('Odkaz pro úpravu v administraci: %s','financni-inzerce')."\r\n".esc_url($edit_link);}$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);if($account_url!==home_url('/')){$message.="\r\n".sprintf(__('Správa inzerátů na stránce: %s','financni-inzerce'),esc_url($account_url));}}else{$message.=__('Pro úpravu kontaktujte administrátora webu.');}$headers=['Content-Type: text/plain; charset=UTF-8'];if(wp_mail($target_email,$subject,$message,$headers)){update_post_meta($post_id,META_NOTIF_SENT,'1');}}else{update_post_meta($post_id,META_NOTIF_SENT,'no_email');}}$args_expire=['post_type'=>'financni_inzerat','post_status'=>'publish','posts_per_page'=>-1,'meta_query'=>[['key'=>META_EXPIRACE_TS,'value'=>$now_gmt,'compare'=>'<=','type'=>'NUMERIC']],'fields'=>'ids',];$expired_ads=get_posts($args_expire);foreach($expired_ads as $post_id){wp_update_post(['ID'=>$post_id,'post_status'=>'draft']);delete_post_meta($post_id,META_NOTIF_SENT);}} add_action(EXPIRATION_CRON_HOOK,'financni_inzerce_check_expired_ads'); function financni_user_can_edit_own_ad($user_id,$post_id){$post_author_id=get_post_field('post_author',$post_id);if(!$post_author_id||!$user_id)return false;if(user_can($user_id,'edit_others_posts')||($user_id==$post_author_id&&user_can($user_id,'edit_posts'))){return true;}return false;} function financni_inzerce_deactivate(){$timestamp=wp_next_scheduled(EXPIRATION_CRON_HOOK);if($timestamp){wp_unschedule_event($timestamp,EXPIRATION_CRON_HOOK);}} register_deactivation_hook(__FILE__,'financni_inzerce_deactivate'); // ============================================================================= // 8. Slider Blogových příspěvků - Zde není kód // ============================================================================= // ============================================================================= // 9. Registrace Widgetových Oblastí pro Reklamu (v2.1.0) // ============================================================================= function financni_inzerce_register_ad_widget_areas() { // Oblast nad obsahem (původní) register_sidebar( array( 'name' => __( 'Reklama nad obsahem (Rotující)', 'financni-inzerce' ), // Přejmenováno pro srozumitelnost 'id' => 'global-ad-above-content', // Ponecháno původní ID kvůli zpětné kompatibilitě 'description' => __( 'Widgety zde umístěné se zobrazí pomocí funkce financni_inzerce_display_ad_rotator(\'global-ad-above-content\'). Budou automaticky rotovat.', 'financni-inzerce' ), 'before_widget' => ' ', 'before_title' => '
', 'after_title' => '
', ) ); // Nová oblast v patičce register_sidebar( array( 'name' => __( 'Reklama v patičce (Rotující)', 'financni-inzerce' ), 'id' => 'financni-ad-footer', // Nové unikátní ID 'description' => __( 'Widgety zde umístěné se zobrazí pomocí funkce financni_inzerce_display_ad_rotator(\'financni-ad-footer\'). Budou automaticky rotovat (jiný interval).', 'financni-inzerce' ), 'before_widget' => ' ', 'before_title' => '', 'after_title' => '
', ) ); } // Přejmenovaný hook pro registraci add_action( 'widgets_init', 'financni_inzerce_register_ad_widget_areas' ); // ============================================================================= // 10. Vkládání Rotující Reklamy do Šablony (Univerzální funkce) (v2.1.1 - s laděním) // ============================================================================= /** * Zobrazí rotující widgetovou oblast. * * @param string $area_id ID widgetové oblasti. * @param int $interval Interval rotace v ms (default 4000). * @param string $widget_selector CSS selector pro jednotlivé widgety uvnitř oblasti. */ function financni_inzerce_display_ad_rotator( $area_id = 'global-ad-above-content', $interval = 4000, $widget_selector = '.financni-global-ad-widget' ) { echo "\n"; // Ladící výpis if ( is_active_sidebar( $area_id ) ) { echo "\n"; // Ladící výpis // Přidáme data atributy pro JavaScript, aby věděl, co má dělat echo ' '; echo "\n"; // Ladící výpis } else { echo "\n"; // Ladící výpis } } // ============================================================================= // 11. REGISTRACE UŽIVATELŮ se schvalováním // ============================================================================= function financni_handle_registration_form(){if(isset($_POST['financni_register_submit'])&&isset($_POST['financni_register_nonce'])&&wp_verify_nonce($_POST['financni_register_nonce'],'financni_register_action')){global $financni_registration_errors;if(!$financni_registration_errors instanceof WP_Error){$financni_registration_errors=new WP_Error();}$username=isset($_POST['reg_username'])?sanitize_user($_POST['reg_username'],true):'';$email=isset($_POST['reg_email'])?sanitize_email($_POST['reg_email']):'';$password=isset($_POST['reg_password'])?$_POST['reg_password']:'';$password_confirm=isset($_POST['reg_password_confirm'])?$_POST['reg_password_confirm']:'';$ico=isset($_POST['reg_ico'])?sanitize_text_field($_POST['reg_ico']):'';if(empty($username)){$financni_registration_errors->add('username_empty',__('Uživatelské jméno je povinné.','financni-inzerce'));}if(!validate_username($username)){$financni_registration_errors->add('username_invalid',__('Uživatelské jméno obsahuje neplatné znaky.','financni-inzerce'));}if(username_exists($username)){$financni_registration_errors->add('username_exists',__('Uživatelské jméno je již použito.','financni-inzerce'));}if(empty($email)){$financni_registration_errors->add('email_empty',__('Emailová adresa je povinná.','financni-inzerce'));}if(!is_email($email)){$financni_registration_errors->add('email_invalid',__('Zadaná emailová adresa není platná.','financni-inzerce'));}if(email_exists($email)){$financni_registration_errors->add('email_exists',__('Tato emailová adresa je již zaregistrována.','financni-inzerce'));}if(empty($password)){$financni_registration_errors->add('password_empty',__('Heslo je povinné.','financni-inzerce'));}if(empty($password_confirm)){$financni_registration_errors->add('password_confirm_empty',__('Potvrzení hesla je povinné.','financni-inzerce'));}if($password!==$password_confirm){$financni_registration_errors->add('password_mismatch',__('Zadaná hesla se neshodují.','financni-inzerce'));}if(!empty($ico)&&(strlen($ico)!==8||!ctype_digit($ico))){$financni_registration_errors->add('ico_invalid',__('Zadané IČO není platné (očekáváno 8 číslic).','financni-inzerce'));}if(!$financni_registration_errors->has_errors()){$user_data=['user_login'=>$username,'user_email'=>$email,'user_pass'=>$password,'role'=>'subscriber'];$user_id=wp_insert_user($user_data);if(!is_wp_error($user_id)){update_user_meta($user_id,FINANCNI_INZERCE_USER_STATUS,'pending');if(!empty($ico)){update_user_meta($user_id,FINANCNI_INZERCE_USER_ICO,$ico);}financni_send_registration_notifications($user_id,$username,$email);if(session_status()===PHP_SESSION_NONE&&!headers_sent()){@session_start();}if(isset($_SESSION)){$_SESSION['financni_message']=['type'=>'success','text'=>__('Registrace proběhla úspěšně. Váš účet nyní čeká na schválení administrátorem.','financni-inzerce')];}else{set_transient('financni_registration_msg',['type'=>'success','text'=>__('Registrace proběhla úspěšně. Váš účet nyní čeká na schválení administrátorem.','financni-inzerce')],60);}$login_url=financni_get_page_url_by_slug(FINANCNI_LOGIN_PAGE_SLUG);wp_safe_redirect($login_url);exit;}else{$financni_registration_errors->add('user_creation_failed',__('Registrace se nezdařila. Zkuste to prosím znovu.','financni-inzerce'));$financni_registration_errors->merge_from($user_id);}}}} add_action('init','financni_handle_registration_form'); function financni_registration_form_shortcode(){if(is_user_logged_in()){$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);return ' ';}global $financni_registration_errors;ob_start();?>'.esc_html($message['text']).'';}} function financni_login_form_shortcode(){if(is_user_logged_in()){$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);return '
';}ob_start();?>Zaregistrujte se.','financni-inzerce'),esc_url(financni_get_page_url_by_slug(FINANCNI_REGISTER_PAGE_SLUG)));?>
ID,FINANCNI_INZERCE_USER_STATUS,true);if($status_check!=='approved'){$login_url=financni_get_page_url_by_slug(FINANCNI_LOGIN_PAGE_SLUG);$reason=($status_check==='pending'||empty($status_check))?'pending':($status_check==='rejected'?'rejected':'unknown');wp_safe_redirect(add_query_arg(['login'=>'failed','reason'=>$reason],$login_url));exit;}}return $user;}$user_obj=get_user_by('login',$username)?:get_user_by('email',$username);if($user_obj instanceof WP_User){$status=get_user_meta($user_obj->ID,FINANCNI_INZERCE_USER_STATUS,true);if($status!=='approved'){$login_url=financni_get_page_url_by_slug(FINANCNI_LOGIN_PAGE_SLUG);$reason=($status==='pending'||empty($status))?'pending':(($status==='rejected')?'rejected':'unknown');wp_safe_redirect(add_query_arg(['login'=>'failed','reason'=>$reason],$login_url));exit;}}return $user;} add_filter('authenticate','financni_check_user_status_on_login',25,3); function financni_login_redirect($redirect_to,$requested_redirect_to,$user){if(!is_wp_error($user)&&isset($user->ID)){$status=get_user_meta($user->ID,FINANCNI_INZERCE_USER_STATUS,true);if($status==='approved'){if(!user_can($user,'edit_others_posts')){if(!empty($requested_redirect_to)&&strpos($requested_redirect_to,'wp-admin')===false){return $requested_redirect_to;}return financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);}return $redirect_to;}}return $redirect_to;} add_filter('login_redirect','financni_login_redirect',10,3); // ============================================================================= // 13. Úprava Profilu Uživatele v Adminu (IČO a Schvalování) // ============================================================================= function financni_add_custom_user_profile_fields($user){if(!$user instanceof WP_User)return;$can_edit_target_user=current_user_can('edit_user',$user->ID);$is_own_profile=(get_current_user_id()==$user->ID);if(!$can_edit_target_user&&!$is_own_profile){return;}?>ID,FINANCNI_INZERCE_USER_STATUS,true);?>ID,FINANCNI_INZERCE_USER_ICO,true)); >" class="regular-text" pattern="[0-9]{8}" title="< php esc_attr_e('Zadejte 8 číslic IČO','financni-inzerce'); >" < php="" disabled(!$can_edit_target_user&&!$is_own_profile);?="">/> | |
"> | '.__('Upravit','financni-inzerce').'';}if($delete_link){echo ' | '.__('Smazat','financni-inzerce').'';}?> |
Finanční Inzerce: %d uživatel čeká na schválení.','Finanční Inzerce: %d uživatelů čeká na schválení.',$pending_count,'financni-inzerce')),$pending_count);?> " style="margin-left: 10px;">
', 'after_title' => '
', ) ); // Oblast v patičce register_sidebar( array( 'name' => __( 'Reklama v patičce (Rotující)', 'financni-inzerce' ), 'id' => FOOTER_AD_WIDGET_AREA_ID, 'description' => __( 'Widgety zde umístěné se zobrazí pomocí funkce financni_inzerce_display_ad_rotator(\'financni-ad-footer\') nebo hooku wp_footer. Budou automaticky rotovat.', 'financni-inzerce' ), 'before_widget' => ' ', 'before_title' => '', 'after_title' => '
', ) ); } add_action( 'widgets_init', 'financni_inzerce_register_ad_widget_areas' ); // ============================================================================= // 10. Vkládání Rotující Reklamy do Šablony (Univerzální funkce) (v2.1.1+) // ============================================================================= function financni_inzerce_display_ad_rotator( $area_id = GLOBAL_AD_WIDGET_AREA_ID, $interval = 4000, $widget_selector = '.financni-global-ad-widget' ) { // echo "\n"; // Ladící výpis (můžeme zakomentovat) if ( is_active_sidebar( $area_id ) ) { // echo "\n"; // Ladící výpis (můžeme zakomentovat) echo ' '; // echo "\n"; // Ladící výpis (můžeme zakomentovat) } else { // echo "\n"; // Ladící výpis (můžeme zakomentovat) } } // ============================================================================= // 11. REGISTRACE UŽIVATELŮ se schvalováním // ============================================================================= function financni_handle_registration_form(){ /* ... kód zpracování registrace ... */ } // Kód je stejný jako v předchozí verzi add_action('init','financni_handle_registration_form'); function financni_registration_form_shortcode(){ /* ... kód zobrazení reg. formuláře ... */ } // Kód je stejný jako v předchozí verzi if(!shortcode_exists('financni_registrace')){add_shortcode('financni_registrace','financni_registration_form_shortcode');} function financni_send_registration_notifications($user_id,$username,$email){ /* ... kód odeslání emailů ... */ } // Kód je stejný jako v předchozí verzi // ============================================================================= // 12. PŘIHLÁŠENÍ UŽIVATELŮ s kontrolou schválení // ============================================================================= function financni_display_flash_message(){ /* ... kód zobrazení zpráv ... */ } // Kód je stejný jako v předchozí verzi function financni_login_form_shortcode(){ /* ... kód zobrazení login formuláře ... */ } // Kód je stejný jako v předchozí verzi if(!shortcode_exists('financni_prihlaseni')){add_shortcode('financni_prihlaseni','financni_login_form_shortcode');} function financni_check_user_status_on_login($user,$username,$password){ /* ... kód kontroly statusu ... */ } // Kód je stejný jako v předchozí verzi add_filter('authenticate','financni_check_user_status_on_login',25,3); function financni_login_redirect($redirect_to,$requested_redirect_to,$user){ /* ... kód přesměrování ... */ } // Kód je stejný jako v předchozí verzi add_filter('login_redirect','financni_login_redirect',10,3); // ============================================================================= // 13. Úprava Profilu Uživatele v Adminu (IČO a Schvalování) // ============================================================================= function financni_add_custom_user_profile_fields($user){ /* ... kód zobrazení polí v profilu ... */ } // Kód je stejný jako v předchozí verzi add_action('show_user_profile','financni_add_custom_user_profile_fields'); add_action('edit_user_profile','financni_add_custom_user_profile_fields'); function financni_save_custom_user_profile_fields($user_id){ /* ... kód uložení polí z profilu ... */ } // Kód je stejný jako v předchozí verzi add_action('personal_options_update','financni_save_custom_user_profile_fields'); add_action('edit_user_profile_update','financni_save_custom_user_profile_fields'); function financni_send_status_change_notification($user_id,$new_status){ /* ... kód odeslání emailu o změně statusu ... */ } // Kód je stejný jako v předchozí verzi function financni_add_user_status_column($columns){ /* ... kód přidání sloupce ... */ } // Kód je stejný jako v předchozí verzi add_filter('manage_users_columns','financni_add_user_status_column'); function financni_show_user_status_column_content($value,$column_name,$user_id){ /* ... kód zobrazení obsahu sloupce ... */ } // Kód je stejný jako v předchozí verzi add_filter('manage_users_custom_column','financni_show_user_status_column_content',10,3); // ============================================================================= // 14. FRONTEND USER DASHBOARD ([muj_financni_dashboard]) // ============================================================================= function financni_dashboard_shortcode_content(){ /* ... kód pro dashboard ... */ } // Kód je stejný jako v předchozí verzi if(!shortcode_exists('muj_financni_dashboard')){add_shortcode('muj_financni_dashboard','financni_dashboard_shortcode_content');} if(!shortcode_exists('financni_dashboard')){add_shortcode('financni_dashboard','financni_dashboard_shortcode_content');} // ============================================================================= // 15. ADMIN NOTICES (Upozornění na čekající uživatele - Opraveno Deprecated) // ============================================================================= function financni_pending_users_admin_notice(){ if(!current_user_can('manage_options')){return;} // Použití meta_query místo zastaralého who nebo meta_key/meta_value přímo $args = [ 'meta_query' => [ [ 'key' => FINANCNI_INZERCE_USER_STATUS, 'value' => 'pending', 'compare' => '=', ], ], 'count_total' => true, 'fields' => 'ID', ]; $pending_users_query = new WP_User_Query($args); $pending_count = $pending_users_query->get_total(); if($pending_count > 0){?>Finanční Inzerce: %d uživatel čeká na schválení.','Finanční Inzerce: %d uživatelů čeká na schválení.',$pending_count,'financni-inzerce')),$pending_count);?> " style="margin-left: 10px;">
ID)!='auto-draft'&&empty($typ_inzeratu)){echo ' '.__('Toto pole je povinné.','financni-inzerce').' ';}?> | |||||||||||||||
ID)!='auto-draft'&&empty($delka)){echo ' '.__('Toto pole je povinné.','financni-inzerce').' ';}?> | |||||||||||||||
" name="< php echo esc_attr(META_JMENO); >" value="< php echo esc_attr( $jmeno ); >"/> | |||||||||||||||
" name="< php echo esc_attr(META_EMAIL); >" value="< php echo esc_attr( $email ); >">" name="< php echo esc_attr(META_TELEFON); >" value="< php echo esc_attr( $telefon ); >"/> | |||||||||||||||
" name="< php echo esc_attr(META_SAZBA); >" value="< php echo esc_attr( $sazba ); >">'sanitize_text_field',META_EMAIL=>'sanitize_email',META_TELEFON=>'sanitize_text_field',META_TYP_PRODUKTU=>'sanitize_text_field',META_SAZBA=>'sanitize_text_field',META_DELKA=>'intval',META_TYP_INZERATU=>'sanitize_key',];
foreach($fields_to_process as $meta_key=>$sanitize_callback){if(isset($_POST[$meta_key])){$raw_value=$_POST[$meta_key];$sanitized_value=call_user_func($sanitize_callback,$raw_value);$is_valid=true;if($meta_key===META_TYP_INZERATU){if(empty($sanitized_value)||!in_array($sanitized_value,VALID_TYP_INZERATU_OPTIONS)){$is_valid=false;}}elseif($meta_key===META_DELKA){if(!in_array($sanitized_value,VALID_DELKA_OPTIONS)){$is_valid=false;}}if($is_valid&&($sanitized_value||$sanitized_value===0||$sanitized_value==='0')){update_post_meta($post_id,$meta_key,$sanitized_value);}else{delete_post_meta($post_id,$meta_key);}}else{delete_post_meta($post_id,$meta_key);}}
}
add_action( 'save_post_financni_inzerat', 'financni_inzerce_save_meta_box_data' );
// =============================================================================
// 3. Shortcode [pridat_financni_inzerat] - Formulář pro přidání
// =============================================================================
function financni_inzerce_sidebar_form_shortcode() {
$success_message = ''; $error_messages = [];
if ( isset( $_POST['financni_inzerce_submit_sidebar'] ) ) {
if ( !isset($_POST['financni_inzerce_sidebar_nonce']) || !wp_verify_nonce($_POST['financni_inzerce_sidebar_nonce'], 'financni_inzerce_add_sidebar') ) { $error_messages[] = __('Chyba zabezpečení formuláře.', 'financni-inzerce'); }
if ( !is_user_logged_in() ) { $error_messages[] = __('Pro přidání inzerátu se musíte přihlásit.', 'financni-inzerce'); } else {
$user_id = get_current_user_id(); $status = get_user_meta( $user_id, FINANCNI_INZERCE_USER_STATUS, true );
if ( $status !== 'approved' ) { $error_messages[] = __( 'Váš účet není aktivní nebo ještě nebyl schválen administrátorem. Nemůžete přidávat inzeráty.', 'financni-inzerce' ); }
if ( empty($error_messages) && isset($_POST[META_TYP_INZERATU]) && $_POST[META_TYP_INZERATU] === 'nabidka' ) { $user_ico = get_user_meta($user_id, FINANCNI_INZERCE_USER_ICO, true); if ( empty($user_ico) ) { $profile_url = get_edit_user_link($user_id); $error_messages[] = sprintf( __('Pro vložení nabídky musíte mít ve svém profilu vyplněné platné IČO. Upravit profil.', 'financni-inzerce'), esc_url($profile_url) ); } }
}
if ( empty($error_messages) ) { if ( empty( trim($_POST['inzerat_title']) ) ) { $error_messages[] = __('Název inzerátu je povinný.', 'financni-inzerce'); } if ( empty( $_POST[META_TYP_INZERATU] ) || ! in_array( $_POST[META_TYP_INZERATU], VALID_TYP_INZERATU_OPTIONS ) ) { $error_messages[] = __('Musíte zvolit platný typ inzerátu (Nabídka/Poptávka).', 'financni-inzerce'); } if ( empty( $_POST[META_DELKA] ) || ! in_array( intval($_POST[META_DELKA]), VALID_DELKA_OPTIONS ) ) { $error_messages[] = __('Musíte zvolit platnou délku zobrazení.', 'financni-inzerce'); } if ( ! empty( $_POST[META_EMAIL] ) && ! is_email( $_POST[META_EMAIL] ) ) { $error_messages[] = __('Zadaný kontaktní email není platný.', 'financni-inzerce'); } }
if ( empty( $error_messages ) ) {
$title = sanitize_text_field( $_POST['inzerat_title'] ); $content = wp_kses_post( $_POST['inzerat_content'] ); $jmeno = sanitize_text_field( $_POST[META_JMENO] ); $email = sanitize_email( $_POST[META_EMAIL] ); $telefon = sanitize_text_field( $_POST[META_TELEFON] ); $typ_produktu = sanitize_text_field( $_POST[META_TYP_PRODUKTU] ); $sazba = sanitize_text_field( $_POST[META_SAZBA] ); $delka = intval( $_POST[META_DELKA] ); $typ_inzeratu = sanitize_key($_POST[META_TYP_INZERATU]);
$post_data = [ 'post_title' => $title, 'post_content' => $content, 'post_type' => 'financni_inzerat', 'post_status' => 'pending', 'post_author' => get_current_user_id() ];
$new_post_id = wp_insert_post( $post_data, true );
if ( !is_wp_error( $new_post_id ) ) { update_post_meta( $new_post_id, META_JMENO, $jmeno ); update_post_meta( $new_post_id, META_EMAIL, $email ); update_post_meta( $new_post_id, META_TELEFON, $telefon ); update_post_meta( $new_post_id, META_TYP_PRODUKTU, $typ_produktu ); update_post_meta( $new_post_id, META_SAZBA, $sazba ); update_post_meta( $new_post_id, META_DELKA, $delka ); update_post_meta( $new_post_id, META_TYP_INZERATU, $typ_inzeratu ); $success_message = __( 'Váš inzerát byl úspěšně odeslán ke schválení administrátorem.', 'financni-inzerce' );
$admin_email = get_option( 'admin_email' ); if ( $admin_email ) { $post_title_for_email = get_the_title($new_post_id); $subject = sprintf( __('[%s] Nový inzerát "%s" čeká na schválení', 'financni-inzerce' ), get_bloginfo('name'), $post_title_for_email ); $edit_link = admin_url( 'post.php?post=' . $new_post_id . '&action=edit' ); $author_info = get_userdata(get_current_user_id()); $typ_inzeratu_text = ($typ_inzeratu == 'nabidka' ? __('Nabídka', 'financni-inzerce') : __('Poptávka', 'financni-inzerce')); $message = sprintf( __( 'Nový finanční inzerát "%s" (%s) byl přidán uživatelem %s a čeká na Vaše schválení.', 'financni-inzerce' ), esc_html($post_title_for_email), esc_html($typ_inzeratu_text), ($author_info ? esc_html($author_info->display_name) : __('Neznámý', 'financni-inzerce')) ); $message .= "\r\n\r\n" . __( 'Odkaz pro úpravu a schválení:', 'financni-inzerce' ) . "\r\n" . esc_url($edit_link) . "\r\n"; $headers = ['Content-Type: text/plain; charset=UTF-8']; wp_mail( $admin_email, $subject, $message, $headers ); } $_POST = [];
} else { $error_messages[] = __( 'Došlo k chybě při ukládání inzerátu.', 'financni-inzerce' ); $error_messages[] = $new_post_id->get_error_message(); }
}
}
ob_start();
$post_data=!empty($_POST)?$_POST:[];$prev_typ_inzeratu=isset($post_data[META_TYP_INZERATU])?$post_data[META_TYP_INZERATU]:'';$prev_title=isset($post_data['inzerat_title'])?esc_attr($post_data['inzerat_title']):'';$prev_content=isset($post_data['inzerat_content'])?esc_textarea($post_data['inzerat_content']):'';$prev_jmeno=isset($post_data[META_JMENO])?esc_attr($post_data[META_JMENO]):'';$prev_email=isset($post_data[META_EMAIL])?esc_attr($post_data[META_EMAIL]):'';$prev_telefon=isset($post_data[META_TELEFON])?esc_attr($post_data[META_TELEFON]):'';$prev_typ_produktu=isset($post_data[META_TYP_PRODUKTU])?$post_data[META_TYP_PRODUKTU]:'';$prev_sazba=isset($post_data[META_SAZBA])?esc_attr($post_data[META_SAZBA]):'';$prev_delka=isset($post_data[META_DELKA])?$post_data[META_DELKA]:'';
?>
'.esc_html($success_message).'';} if(!empty($error_messages)){echo ''; foreach($error_messages as $msg){echo wp_kses($msg,['a'=>['href'=>[],'target'=>[],'style'=>[]]]).' ';} echo '';} ?> " method="post" id="financni-inzerce-sidebar-form"> " name="inzerat_title" required="" value="< php echo $prev_title; >"/> " name="< php echo esc_attr(META_JMENO); >" value="< php echo $prev_jmeno; >"/> " name="< php echo esc_attr(META_EMAIL); >" value="< php echo $prev_email; >"/> " name="< php echo esc_attr(META_TELEFON); >" value="< php echo $prev_telefon; >"/> " name="< php echo esc_attr(META_SAZBA); >" value="< php echo $prev_sazba; >"/> " class="button"/> " class="button"> " class="button"> 10,'typ'=>'',],$atts,'zobrazit_financni_inzeraty'); $args=['post_type'=>'financni_inzerat','post_status'=>'publish','posts_per_page'=>intval($atts['pocet']),'meta_query'=>[],'orderby'=>'date','order'=>'DESC',]; if(!empty($atts['typ'])&&in_array($atts['typ'],VALID_TYP_INZERATU_OPTIONS)){$args['meta_query'][]=['key'=>META_TYP_INZERATU,'value'=>sanitize_key($atts['typ']),'compare'=>'=',];} $args['meta_query'][]=['relation'=>'OR',['key'=>META_EXPIRACE_TS,'compare'=>'NOT EXISTS',],['key'=>META_EXPIRACE_TS,'value'=>current_time('timestamp',true),'compare'=>'>','type'=>'NUMERIC',]]; if(count($args['meta_query'])>1){$args['meta_query']['relation']='AND';}elseif(empty($args['meta_query'])){unset($args['meta_query']);} $query=new WP_Query($args);$output=''; if($query->have_posts()){$output.='';while($query->have_posts()){$query->the_post();$post_id=get_the_ID();$typ_inzeratu=get_post_meta($post_id,META_TYP_INZERATU,true);$typ_produktu=get_post_meta($post_id,META_TYP_PRODUKTU,true);$output.='';$output.=''.get_the_title().'';$output.='';$output.=' ';if($typ_produktu){$output.=' ';}$output.=' ';$output.='';$output.=''.get_the_excerpt().'';$output.=''.__('Zobrazit detail','financni-inzerce').'';$output.='';}$output.='';wp_reset_postdata();}else{$output.=''.__('Aktuálně zde nejsou žádné inzeráty odpovídající zadaným kritériím.','financni-inzerce').'';} return $output;} if(!shortcode_exists('zobrazit_financni_inzeraty')){add_shortcode('zobrazit_financni_inzeraty','financni_inzerce_display_shortcode');} // ============================================================================= // 5. Zobrazení Detailů Inzerátu (the_content filtr) // ============================================================================= function financni_inzerce_display_details_in_content($content){if(is_singular('financni_inzerat')&&in_the_loop()&&is_main_query()){global $post;$post_id=$post->ID;$expirace_ts_check=get_post_meta($post_id,META_EXPIRACE_TS,true);if($expirace_ts_check&&$expirace_ts_check<=current_time('timestamp',true)){return ''.__('Tento inzerát již expiroval.','financni-inzerce').'';}$details_html='';$details_html.=''.__('Detaily inzerátu','financni-inzerce').'';$details_html.='';$jmeno=get_post_meta($post_id,META_JMENO,true);$email=get_post_meta($post_id,META_EMAIL,true);$telefon=get_post_meta($post_id,META_TELEFON,true);$typ_produktu=get_post_meta($post_id,META_TYP_PRODUKTU,true);$sazba=get_post_meta($post_id,META_SAZBA,true);$typ_inzeratu=get_post_meta($post_id,META_TYP_INZERATU,true);$expirace_ts=get_post_meta($post_id,META_EXPIRACE_TS,true);$author_id=$post->post_author;$author_info=get_userdata($author_id);$author_name=$author_info?$author_info->display_name:__('Neznámý','financni-inzerce');$details_html.=''.__('Typ inzerátu:','financni-inzerce').' '.esc_html(($typ_inzeratu=='nabidka'?__('Nabídka','financni-inzerce'):__('Poptávka','financni-inzerce'))).'';if($typ_produktu){$details_html.=''.__('Typ produktu:','financni-inzerce').' '.esc_html(ucfirst($typ_produktu)).'';}if($sazba){$details_html.=''.__('Sazba/Popis:','financni-inzerce').' '.esc_html($sazba).'';}if($expirace_ts){$details_html.=''.__('Platnost do:','financni-inzerce').' '.date_i18n(get_option('date_format'),$expirace_ts).'';}$details_html.=''.__('Vložil:','financni-inzerce').' '.esc_html($author_name).'';if(is_user_logged_in()){$current_user_id=get_current_user_id();$current_user_status=get_user_meta($current_user_id,FINANCNI_INZERCE_USER_STATUS,true);if($current_user_status==='approved'||current_user_can('manage_options')){$details_html.='';$details_html.=''.__('Kontaktní údaje','financni-inzerce').'';$details_html.='';if($jmeno){$details_html.=''.__('Kontakt:','financni-inzerce').' '.esc_html($jmeno).'';}if($email){$details_html.=''.__('Email:','financni-inzerce').' '.esc_html($email).'';}if($telefon){$details_html.=''.__('Telefon:','financni-inzerce').' '.esc_html($telefon).'';}if(empty($jmeno)&&empty($email)&&empty($telefon)){$details_html.=''.__('Kontaktní údaje nebyly zadány.','financni-inzerce').'';}$details_html.='';}else{$details_html.=''.__('Kontaktní údaje:','financni-inzerce').' '.__('Pouze pro přihlášené a schválené uživatele.','financni-inzerce').'';$details_html.='';}}else{$login_url=financni_get_page_url_by_slug(FINANCNI_LOGIN_PAGE_SLUG);$details_html.=''.__('Kontaktní údaje:','financni-inzerce').' '.sprintf(__('Pro zobrazení se přihlaste.','financni-inzerce'),esc_url($login_url)).'';$details_html.='';}$details_html.='';return $details_html.$content;}return $content;} add_filter('the_content','financni_inzerce_display_details_in_content',20); // ============================================================================= // 6. Nastavení Expirace Inzerátu při Publikaci / Změně Statusu // ============================================================================= function financni_inzerce_set_update_expiration($new_status,$old_status,$post){if(!$post instanceof WP_Post){if(isset($_POST['post_ID'])){$post=get_post($_POST['post_ID']);if(!$post)return;}else{return;}}if($post->post_type==='financni_inzerat'){if($new_status==='publish'&&$old_status!=='publish'){$delka_dny=get_post_meta($post->ID,META_DELKA,true);if(!empty($delka_dny)&&is_numeric($delka_dny)&&in_array($delka_dny,VALID_DELKA_OPTIONS)){$publish_time_gmt=strtotime($post->post_date_gmt);$now_gmt=current_time('timestamp',true);$base_time_gmt=($publish_time_gmt>$now_gmt)?$publish_time_gmt:$now_gmt;$expirace_ts=$base_time_gmt+(intval($delka_dny)*DAY_IN_SECONDS);update_post_meta($post->ID,META_EXPIRACE_TS,$expirace_ts);delete_post_meta($post->ID,META_NOTIF_SENT);}else{delete_post_meta($post->ID,META_EXPIRACE_TS);delete_post_meta($post->ID,META_NOTIF_SENT);}}}} add_action('transition_post_status','financni_inzerce_set_update_expiration',10,3); // ============================================================================= // 7. Kontrola Expirace a Notifikace (WP-Cron) // ============================================================================= if(!wp_next_scheduled(EXPIRATION_CRON_HOOK)){wp_schedule_event(strtotime('today 2:00am'),'daily',EXPIRATION_CRON_HOOK);} function financni_inzerce_check_expired_ads(){$now_gmt=current_time('timestamp',true);$three_days_from_now_gmt=$now_gmt+(3*DAY_IN_SECONDS);$args_notify=['post_type'=>'financni_inzerat','post_status'=>'publish','posts_per_page'=>-1,'meta_query'=>['relation'=>'AND',['key'=>META_EXPIRACE_TS,'compare'=>'EXISTS'],['key'=>META_EXPIRACE_TS,'value'=>$now_gmt,'compare'=>'>','type'=>'NUMERIC'],['key'=>META_EXPIRACE_TS,'value'=>$three_days_from_now_gmt,'compare'=>'<=','type'=>'NUMERIC'],['key'=>META_NOTIF_SENT,'compare'=>'NOT EXISTS'],],'fields'=>'ids',];$ads_to_notify=get_posts($args_notify);foreach($ads_to_notify as $post_id){$kontakt_email=get_post_meta($post_id,META_EMAIL,true);$author_id=get_post_field('post_author',$post_id);$author_info=get_userdata($author_id);$author_email=$author_info?$author_info->user_email:null;$target_email=(!empty($kontakt_email)&&is_email($kontakt_email))?$kontakt_email:((!empty($author_email)&&is_email($author_email))?$author_email:null);if($target_email){$post_title=get_the_title($post_id);$expirace_ts=get_post_meta($post_id,META_EXPIRACE_TS,true);$expirace_datum=date_i18n(get_option('date_format').' '.get_option('time_format'),$expirace_ts+(get_option('gmt_offset')*HOUR_IN_SECONDS));$subject=sprintf(__('[%s] Váš inzerát "%s" brzy expiruje','financni-inzerce'),get_bloginfo('name'),$post_title);$message=sprintf(__('Dobrý den,','financni-inzerce'))."\r\n\r\n";$message.=sprintf(__('Váš finanční inzerát "%s" na webu %s brzy expiruje.','financni-inzerce'),$post_title,get_bloginfo('name'))."\r\n";$message.=sprintf(__('Datum expirace: %s','financni-inzerce'),$expirace_datum)."\r\n\r\n";$message.=__('Pokud chcete inzerát prodloužit, můžete jej upravit a znovu publikovat.')."\r\n";if(financni_user_can_edit_own_ad($author_id,$post_id)){$edit_link=get_edit_post_link($post_id,'');if($edit_link){$message.="\r\n".__('Odkaz pro úpravu v administraci: %s','financni-inzerce')."\r\n".esc_url($edit_link);}$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);if($account_url!==home_url('/')){$message.="\r\n".sprintf(__('Správa inzerátů na stránce: %s','financni-inzerce'),esc_url($account_url));}}else{$message.=__('Pro úpravu kontaktujte administrátora webu.');}$headers=['Content-Type: text/plain; charset=UTF-8'];if(wp_mail($target_email,$subject,$message,$headers)){update_post_meta($post_id,META_NOTIF_SENT,'1');}}else{update_post_meta($post_id,META_NOTIF_SENT,'no_email');}}$args_expire=['post_type'=>'financni_inzerat','post_status'=>'publish','posts_per_page'=>-1,'meta_query'=>[['key'=>META_EXPIRACE_TS,'value'=>$now_gmt,'compare'=>'<=','type'=>'NUMERIC']],'fields'=>'ids',];$expired_ads=get_posts($args_expire);foreach($expired_ads as $post_id){wp_update_post(['ID'=>$post_id,'post_status'=>'draft']);delete_post_meta($post_id,META_NOTIF_SENT);}} add_action(EXPIRATION_CRON_HOOK,'financni_inzerce_check_expired_ads'); function financni_user_can_edit_own_ad($user_id,$post_id){$post_author_id=get_post_field('post_author',$post_id);if(!$post_author_id||!$user_id)return false;if(user_can($user_id,'edit_others_posts')||($user_id==$post_author_id&&user_can($user_id,'edit_posts'))){return true;}return false;} function financni_inzerce_deactivate(){$timestamp=wp_next_scheduled(EXPIRATION_CRON_HOOK);if($timestamp){wp_unschedule_event($timestamp,EXPIRATION_CRON_HOOK);}} register_deactivation_hook(__FILE__,'financni_inzerce_deactivate'); // ============================================================================= // 8. Slider Blogových příspěvků - Zde není kód // ============================================================================= // ============================================================================= // 9. Registrace Widgetových Oblastí pro Reklamu (v2.1.0) // ============================================================================= function financni_inzerce_register_ad_widget_areas() { // Oblast nad obsahem (původní) register_sidebar( array( 'name' => __( 'Reklama nad obsahem (Rotující)', 'financni-inzerce' ), // Přejmenováno pro srozumitelnost 'id' => 'global-ad-above-content', // Ponecháno původní ID kvůli zpětné kompatibilitě 'description' => __( 'Widgety zde umístěné se zobrazí pomocí funkce financni_inzerce_display_ad_rotator(\'global-ad-above-content\'). Budou automaticky rotovat.', 'financni-inzerce' ), 'before_widget' => '', // Třída pro JS 'after_widget' => '', 'before_title' => '', 'after_title' => '', ) ); // Nová oblast v patičce register_sidebar( array( 'name' => __( 'Reklama v patičce (Rotující)', 'financni-inzerce' ), 'id' => 'financni-ad-footer', // Nové unikátní ID 'description' => __( 'Widgety zde umístěné se zobrazí pomocí funkce financni_inzerce_display_ad_rotator(\'financni-ad-footer\'). Budou automaticky rotovat (jiný interval).', 'financni-inzerce' ), 'before_widget' => '', // Jiná třída pro JS 'after_widget' => '', 'before_title' => '', 'after_title' => '', ) ); } // Přejmenovaný hook pro registraci add_action( 'widgets_init', 'financni_inzerce_register_ad_widget_areas' ); // ============================================================================= // 10. Vkládání Rotující Reklamy do Šablony (Univerzální funkce) (v2.1.1 - s laděním) // ============================================================================= /** * Zobrazí rotující widgetovou oblast. * * @param string $area_id ID widgetové oblasti. * @param int $interval Interval rotace v ms (default 4000). * @param string $widget_selector CSS selector pro jednotlivé widgety uvnitř oblasti. */ function financni_inzerce_display_ad_rotator( $area_id = 'global-ad-above-content', $interval = 4000, $widget_selector = '.financni-global-ad-widget' ) { echo "\n"; // Ladící výpis if ( is_active_sidebar( $area_id ) ) { echo "\n"; // Ladící výpis // Přidáme data atributy pro JavaScript, aby věděl, co má dělat echo ''; dynamic_sidebar( $area_id ); echo ''; echo "\n"; // Ladící výpis } else { echo "\n"; // Ladící výpis } } // ============================================================================= // 11. REGISTRACE UŽIVATELŮ se schvalováním // ============================================================================= function financni_handle_registration_form(){if(isset($_POST['financni_register_submit'])&&isset($_POST['financni_register_nonce'])&&wp_verify_nonce($_POST['financni_register_nonce'],'financni_register_action')){global $financni_registration_errors;if(!$financni_registration_errors instanceof WP_Error){$financni_registration_errors=new WP_Error();}$username=isset($_POST['reg_username'])?sanitize_user($_POST['reg_username'],true):'';$email=isset($_POST['reg_email'])?sanitize_email($_POST['reg_email']):'';$password=isset($_POST['reg_password'])?$_POST['reg_password']:'';$password_confirm=isset($_POST['reg_password_confirm'])?$_POST['reg_password_confirm']:'';$ico=isset($_POST['reg_ico'])?sanitize_text_field($_POST['reg_ico']):'';if(empty($username)){$financni_registration_errors->add('username_empty',__('Uživatelské jméno je povinné.','financni-inzerce'));}if(!validate_username($username)){$financni_registration_errors->add('username_invalid',__('Uživatelské jméno obsahuje neplatné znaky.','financni-inzerce'));}if(username_exists($username)){$financni_registration_errors->add('username_exists',__('Uživatelské jméno je již použito.','financni-inzerce'));}if(empty($email)){$financni_registration_errors->add('email_empty',__('Emailová adresa je povinná.','financni-inzerce'));}if(!is_email($email)){$financni_registration_errors->add('email_invalid',__('Zadaná emailová adresa není platná.','financni-inzerce'));}if(email_exists($email)){$financni_registration_errors->add('email_exists',__('Tato emailová adresa je již zaregistrována.','financni-inzerce'));}if(empty($password)){$financni_registration_errors->add('password_empty',__('Heslo je povinné.','financni-inzerce'));}if(empty($password_confirm)){$financni_registration_errors->add('password_confirm_empty',__('Potvrzení hesla je povinné.','financni-inzerce'));}if($password!==$password_confirm){$financni_registration_errors->add('password_mismatch',__('Zadaná hesla se neshodují.','financni-inzerce'));}if(!empty($ico)&&(strlen($ico)!==8||!ctype_digit($ico))){$financni_registration_errors->add('ico_invalid',__('Zadané IČO není platné (očekáváno 8 číslic).','financni-inzerce'));}if(!$financni_registration_errors->has_errors()){$user_data=['user_login'=>$username,'user_email'=>$email,'user_pass'=>$password,'role'=>'subscriber'];$user_id=wp_insert_user($user_data);if(!is_wp_error($user_id)){update_user_meta($user_id,FINANCNI_INZERCE_USER_STATUS,'pending');if(!empty($ico)){update_user_meta($user_id,FINANCNI_INZERCE_USER_ICO,$ico);}financni_send_registration_notifications($user_id,$username,$email);if(session_status()===PHP_SESSION_NONE&&!headers_sent()){@session_start();}if(isset($_SESSION)){$_SESSION['financni_message']=['type'=>'success','text'=>__('Registrace proběhla úspěšně. Váš účet nyní čeká na schválení administrátorem.','financni-inzerce')];}else{set_transient('financni_registration_msg',['type'=>'success','text'=>__('Registrace proběhla úspěšně. Váš účet nyní čeká na schválení administrátorem.','financni-inzerce')],60);}$login_url=financni_get_page_url_by_slug(FINANCNI_LOGIN_PAGE_SLUG);wp_safe_redirect($login_url);exit;}else{$financni_registration_errors->add('user_creation_failed',__('Registrace se nezdařila. Zkuste to prosím znovu.','financni-inzerce'));$financni_registration_errors->merge_from($user_id);}}}} add_action('init','financni_handle_registration_form'); function financni_registration_form_shortcode(){if(is_user_logged_in()){$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);return ''.sprintf(__('Jste již přihlášeni. Přejít na můj účet.','financni-inzerce'),esc_url($account_url)).'';}global $financni_registration_errors;ob_start();?>has_errors()){echo '';foreach($financni_registration_errors->get_error_messages() as $error){echo ''.esc_html($error).' ';}echo '';}?>">" required="">" required="">" pattern="[0-9]{8}" title="< php esc_attr_e('Zadejte 8 číslic IČO','financni-inzerce'); >">" class="button">'.esc_html($message['text']).'';}} function financni_login_form_shortcode(){if(is_user_logged_in()){$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);return ''.sprintf(__('Jste již přihlášeni. Přejít na můj účet.','financni-inzerce'),esc_url($account_url)).'';}ob_start();?>'.esc_html($error_message).'';}$login_form_args=['echo'=>true,'redirect'=>financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG),'form_id'=>'financni-loginform','label_username'=>__('Uživatelské jméno nebo Email','financni-inzerce'),'label_password'=>__('Heslo','financni-inzerce'),'label_remember'=>__('Zapamatovat si mě','financni-inzerce'),'label_log_in'=>__('Přihlásit se','financni-inzerce'),'id_username'=>'user_login','id_password'=>'user_pass','id_remember'=>'rememberme','id_submit'=>'wp-submit','remember'=>true,'value_username'=>isset($_REQUEST['log'])?esc_attr(wp_unslash($_REQUEST['log'])):'','value_remember'=>true];wp_login_form($login_form_args);?>">Zaregistrujte se.','financni-inzerce'),esc_url(financni_get_page_url_by_slug(FINANCNI_REGISTER_PAGE_SLUG)));?>ID,FINANCNI_INZERCE_USER_STATUS,true);if($status_check!=='approved'){$login_url=financni_get_page_url_by_slug(FINANCNI_LOGIN_PAGE_SLUG);$reason=($status_check==='pending'||empty($status_check))?'pending':($status_check==='rejected'?'rejected':'unknown');wp_safe_redirect(add_query_arg(['login'=>'failed','reason'=>$reason],$login_url));exit;}}return $user;}$user_obj=get_user_by('login',$username)?:get_user_by('email',$username);if($user_obj instanceof WP_User){$status=get_user_meta($user_obj->ID,FINANCNI_INZERCE_USER_STATUS,true);if($status!=='approved'){$login_url=financni_get_page_url_by_slug(FINANCNI_LOGIN_PAGE_SLUG);$reason=($status==='pending'||empty($status))?'pending':(($status==='rejected')?'rejected':'unknown');wp_safe_redirect(add_query_arg(['login'=>'failed','reason'=>$reason],$login_url));exit;}}return $user;} add_filter('authenticate','financni_check_user_status_on_login',25,3); function financni_login_redirect($redirect_to,$requested_redirect_to,$user){if(!is_wp_error($user)&&isset($user->ID)){$status=get_user_meta($user->ID,FINANCNI_INZERCE_USER_STATUS,true);if($status==='approved'){if(!user_can($user,'edit_others_posts')){if(!empty($requested_redirect_to)&&strpos($requested_redirect_to,'wp-admin')===false){return $requested_redirect_to;}return financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);}return $redirect_to;}}return $redirect_to;} add_filter('login_redirect','financni_login_redirect',10,3); // ============================================================================= // 13. Úprava Profilu Uživatele v Adminu (IČO a Schvalování) // ============================================================================= function financni_add_custom_user_profile_fields($user){if(!$user instanceof WP_User)return;$can_edit_target_user=current_user_can('edit_user',$user->ID);$is_own_profile=(get_current_user_id()==$user->ID);if(!$can_edit_target_user&&!$is_own_profile){return;}?>ID,FINANCNI_INZERCE_USER_STATUS,true);?>
|