DoporučujemeZaložit web nebo e-shop
Vyřízení půjčky snadno a rychle
Vyřízení půjčky snadno a rychle
ID ); } if ($slug === FINANCNI_LOGIN_PAGE_SLUG) { return wp_login_url( financni_get_page_url_by_slug( FINANCNI_ACCOUNT_PAGE_SLUG ) ); } if ($slug === FINANCNI_REGISTER_PAGE_SLUG && get_option('users_can_register')) { return wp_registration_url(); } if ($slug === FINANCNI_ACCOUNT_PAGE_SLUG) { return home_url('/'); } if ($slug === FINANCNI_ADD_AD_PAGE_SLUG) { return '#'; } return home_url('/'); } // ============================================================================= // 1. Registrace CPT 'financni_inzerat' // ============================================================================= function financni_inzerce_register_post_type() { $labels = [ 'name' => _x( 'Finanční Inzeráty', 'Post Type General Name', 'financni-inzerce' ), 'singular_name' => _x( 'Finanční Inzerát', 'Post Type Singular Name', 'financni-inzerce' ), 'menu_name' => __( 'Finanční Inzeráty', 'financni-inzerce' ), 'name_admin_bar' => __( 'Finanční Inzerát', 'financni-inzerce' ), 'archives' => __( 'Archiv Inzerátů', 'financni-inzerce' ), 'attributes' => __( 'Atributy Inzerátu', 'financni-inzerce' ), 'parent_item_colon' => __( 'Nadřazený Inzerát:', 'financni-inzerce' ), 'all_items' => __( 'Všechny Inzeráty', 'financni-inzerce' ), 'add_new_item' => __( 'Přidat Nový Inzerát', 'financni-inzerce' ), 'add_new' => __( 'Přidat Nový', 'financni-inzerce' ), 'new_item' => __( 'Nový Inzerát', 'financni-inzerce' ), 'edit_item' => __( 'Upravit Inzerát', 'financni-inzerce' ), 'update_item' => __( 'Aktualizovat Inzerát', 'financni-inzerce' ), 'view_item' => __( 'Zobrazit Inzerát', 'financni-inzerce' ), 'view_items' => __( 'Zobrazit Inzeráty', 'financni-inzerce' ), 'search_items' => __( 'Hledat Inzerát', 'financni-inzerce' ), 'not_found' => __( 'Nenalezeno', 'financni-inzerce' ), 'not_found_in_trash' => __( 'Nenalezeno v Koši', 'financni-inzerce' ), 'featured_image' => __( 'Obrázek Inzerátu', 'financni-inzerce' ), 'set_featured_image' => __( 'Nastavit Obrázek Inzerátu', 'financni-inzerce' ), 'remove_featured_image' => __( 'Odebrat Obrázek Inzerátu', 'financni-inzerce' ), 'use_featured_image' => __( 'Použít jako Obrázek Inzerátu', 'financni-inzerce' ), 'insert_into_item' => __( 'Vložit do Inzerátu', 'financni-inzerce' ), 'uploaded_to_this_item' => __( 'Nahráno k tomuto Inzerátu', 'financni-inzerce' ), 'items_list' => __( 'Seznam Inzerátů', 'financni-inzerce' ), 'items_list_navigation' => __( 'Navigace Seznamu Inzerátů', 'financni-inzerce' ), 'filter_items_list' => __( 'Filtrovat Seznam Inzerátů', 'financni-inzerce' ), ]; $args = [ 'label' => __( 'Finanční Inzerát', 'financni-inzerce' ), 'description' => __( 'Inzeráty finančních produktů', 'financni-inzerce' ), 'labels' => $labels, 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields', 'excerpt', 'author' ], 'taxonomies' => [], 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'menu_icon' => 'dashicons-list-view', 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'post', 'rewrite' => [ 'slug' => 'financni-inzeraty', 'with_front' => true ], 'show_in_rest' => true, ]; register_post_type( 'financni_inzerat', $args ); } add_action( 'init', 'financni_inzerce_register_post_type', 0 ); // ============================================================================= // 2. Meta Boxy pro Inzeráty // ============================================================================= function financni_inzerce_add_meta_box() { add_meta_box( 'financni_inzerce_details_meta_box', __( 'Detaily Inzerátu', 'financni-inzerce' ), 'financni_inzerce_meta_box_callback', 'financni_inzerat', 'normal', 'high' ); } add_action( 'add_meta_boxes', 'financni_inzerce_add_meta_box' ); function financni_inzerce_meta_box_callback( $post ) { wp_nonce_field( 'financni_inzerce_save_meta_box_data', 'financni_inzerce_meta_box_nonce' ); $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 ); $delka = get_post_meta( $post->ID, META_DELKA, true ); $typ_inzeratu = get_post_meta( $post->ID, META_TYP_INZERATU, true ); ?> .fi-meta-box-table{width:100%;border-collapse:collapse;margin-top:10px}.fi-meta-box-table th,.fi-meta-box-table td{padding:10px 5px;text-align:left;vertical-align:top;border-bottom:1px solid #eee}.fi-meta-box-table th{width:25%;font-weight:600}.fi-meta-box-table td input[type=text],.fi-meta-box-table td input[type=email],.fi-meta-box-table td input[type=tel],.fi-meta-box-table td select{width:100%;max-width:400px;padding:5px}.fi-meta-box-table small{color:#666;display:block;margin-top:5px}.fi-required-label{color:#d63638;font-weight:700}.fi-meta-box-table td label{display:inline-block;margin-right:15px}.fi-meta-box-table td p.error{color:#d63638;margin:5px 0 0;font-size:.9em}
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"/>
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.=''.sprintf(__("Typ: %s",'financni-inzerce'),($typ_inzeratu=='nabidka'?__('Nabídka','financni-inzerce'):__('Poptávka','financni-inzerce'))).'';if($typ_produktu){$output.=''.sprintf(__('Produkt: %s','financni-inzerce'),esc_html(ucfirst($typ_produktu))).'';}$output.=''.sprintf(__('Vloženo: %s','financni-inzerce'),get_the_date()).'';$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.='
  • '.__('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).'
';$details_html.='

'.__('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').'
';}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' => '', ) ); // 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' => '', ) ); } // 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">

'.sprintf(__('Jste již přihlášeni. Přejít na můj účet.','financni-inzerce'),esc_url($account_url)).'
';}ob_start();?>';}$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);?>

">

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);?="">/>

';}$user_id=get_current_user_id();$user_info=get_userdata($user_id);$user_status=get_user_meta($user_id,FINANCNI_INZERCE_USER_STATUS,true);$user_ico=get_user_meta($user_id,FINANCNI_INZERCE_USER_ICO,true);ob_start();?>

'.__('Přidat nový inzerát','financni-inzerce').'

';}elseif($user_status!=='approved'){echo '

'.__('Pro přidávání inzerátů musí být váš účet schválen.','financni-inzerce').'

';}$args_my_ads=['post_type'=>'financni_inzerat','post_status'=>['publish','pending','draft','future','private'],'author'=>$user_id,'posts_per_page'=>-1,'orderby'=>'date','order'=>'DESC',];$my_ads_query=new WP_Query($args_my_ads);if($my_ads_query->have_posts()):?>have_posts()):$my_ads_query->the_post();$post_id=get_the_ID();$status_obj=get_post_status_object(get_post_status($post_id));$status_label=$status_obj?$status_obj->label:get_post_status($post_id);$typ_inzeratu_raw=get_post_meta($post_id,META_TYP_INZERATU,true);$typ_inzeratu_label=($typ_inzeratu_raw==='nabidka')?__('Nabídka','financni-inzerce'):(($typ_inzeratu_raw==='poptavka')?__('Poptávka','financni-inzerce'):'-');$expirace_ts=get_post_meta($post_id,META_EXPIRACE_TS,true);$expirace_datum=$expirace_ts?date_i18n(get_option('date_format'),$expirace_ts):'-';$is_expired=$expirace_ts&&$expirace_ts<=current_time('timestamp',true);if($is_expired&&get_post_status($post_id)==='publish'){$status_label=__('Expirováno','financni-inzerce');}?>
">'.__('Upravit','financni-inzerce').'';}if($delete_link){echo ' | '.__('Smazat','financni-inzerce').'';}?>
'.__('Zatím jste nevložili žádné inzeráty.','financni-inzerce').'

';endif;?>
[['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;">

'failed','reason'=>$reason],$redirect_url));exit;}$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);wp_safe_redirect($account_url);exit;}} add_action('admin_init','financni_block_admin_access'); // ============================================================================= // 17. Načtení stylů a inline skriptu pro rotátory (v2.1.2 - Bez orámování) // ============================================================================= function financni_enqueue_frontend_scripts_styles() { // ---- Inline CSS pro zbytek pluginu ---- $custom_css = " /* === Základní styly (formuláře, zprávy, atd.) === */ .financni-form-container { border: 1px solid #e0e0e0; padding: 20px; margin-bottom: 20px; background-color: #f9f9f9; border-radius: 5px; } .financni-form-container h3, .financni-form-container h4 { margin-top: 0; border-bottom: 1px solid #eee; padding-bottom: 10px; margin-bottom: 15px; } .financni-form-container p { margin-bottom: 15px; } .financni-form-container label { display: block; margin-bottom: 5px; font-weight: bold; } /* ... (VŠECHNA OSTATNÍ CSS PRAVIDLA Z PŘEDCHOZÍ VERZE) ... */ .button-primary:hover { background: #135e96; border-color: #135e96; color: #fff; } /* === Styly pro Rotátor Reklamy (BEZ orámování) === */ .financni-ad-rotator-container { position: relative; /* Nutné pro správné fungování */ overflow: hidden; /* Skryje případný přetékající obsah */ /* border: 1px solid #ccc; */ /* Odstraněno orámování */ /* padding: 5px; */ /* Odstraněn padding */ margin-bottom: 1em; /* Ponecháno odsazení pod rotátorem */ min-height: 50px; /* Minimální výška, aby nekolaboval, když je prázdný */ } .fi-ad-rotator-slide { /* Společná třída pro všechny slidy */ display: none; /* Všechny jsou defaultně skryté */ opacity: 0; transition: opacity 0.5s ease-in-out; /* Plynulý přechod pro opacity (0.5s) */ width: 100%; /* Zajistí plnou šířku */ text-align: center; /* Vycentrování obsahu */ box-sizing: border-box; /* Aby padding neovlivnil šířku */ } .fi-ad-rotator-slide.fi-active-slide { display: block; /* Aktivní slide je zobrazen */ /* Opacity nastavuje JS pro animaci */ } "; // Určení handle pro navázání inline stylů a skriptů $inline_script_handle = 'financni-inline-dependencies'; // Název pro náš handle $inline_style_handle = $inline_script_handle; // Můžeme použít stejný wp_register_script($inline_script_handle, false); wp_enqueue_script($inline_script_handle); if (wp_style_is('wp-block-library', 'enqueued')) { wp_add_inline_style( 'wp-block-library', $custom_css ); } else { // Fallback: registrace a načtení vlastního (prázdného) stylu pro navázání wp_register_style( $inline_style_handle, false ); wp_enqueue_style( $inline_style_handle ); wp_add_inline_style( $inline_style_handle, $custom_css ); } // ---- Inline JavaScript pro rotátor reklamy (beze změny oproti v2.1.1) ---- $rotator_js = " document.addEventListener('DOMContentLoaded', function() { function initAdRotator(containerElement) { const areaId = containerElement.dataset.areaId || 'unknown'; const interval = parseInt(containerElement.dataset.interval, 10) || 4000; const widgetSelector = containerElement.dataset.widgetSelector || '.widget'; const fadeDuration = 500; const widgets = containerElement.querySelectorAll(widgetSelector); if (widgets.length <= 1) { if (widgets.length === 1) { widgets[0].classList.add('fi-ad-rotator-slide'); widgets[0].classList.add('fi-active-slide'); widgets[0].style.display = 'block'; widgets[0].style.opacity = 1; } return; } let currentWidgetIndex = 0; widgets.forEach((widget, index) => { widget.classList.add('fi-ad-rotator-slide'); if (index === currentWidgetIndex) { widget.style.display = 'block'; setTimeout(() => { widget.style.opacity = 1; widget.classList.add('fi-active-slide'); }, 50); } else { widget.style.display = 'none'; widget.style.opacity = 0; widget.classList.remove('fi-active-slide'); } }); setInterval(() => { const currentWidget = widgets[currentWidgetIndex]; if (!currentWidget) return; let nextWidgetIndex = (currentWidgetIndex + 1) % widgets.length; const nextWidget = widgets[nextWidgetIndex]; if (!nextWidget) return; currentWidget.style.opacity = 0; currentWidget.classList.remove('fi-active-slide'); setTimeout(() => { currentWidget.style.display = 'none'; nextWidget.style.display = 'block'; setTimeout(() => { nextWidget.style.opacity = 1; nextWidget.classList.add('fi-active-slide'); }, 50); currentWidgetIndex = nextWidgetIndex; }, fadeDuration); }, interval); } const allRotatorContainers = document.querySelectorAll('.financni-ad-rotator-container'); allRotatorContainers.forEach(container => { initAdRotator(container); }); }); "; wp_add_inline_script( $inline_script_handle, $rotator_js ); } // Registrace upravené funkce pro načítání skriptů a stylů add_action( 'wp_enqueue_scripts', 'financni_enqueue_frontend_scripts_styles' ); // ============================================================================= // 18. Automatické zobrazení patičkové reklamy pomocí hooku (v2.1.2+) // ============================================================================= add_action( 'wp_footer', 'financni_inzerce_display_footer_ad_action', 20 ); // Naváže funkci na patičku function financni_inzerce_display_footer_ad_action() { // Zobrazíme patičkovou reklamu s nastavením intervalu a selektoru // Zkontrolujeme také, jestli je v oblasti nějaký widget, abychom nevypisovali prázdný kontejner if ( function_exists( 'financni_inzerce_display_ad_rotator' ) && is_active_sidebar( FOOTER_AD_WIDGET_AREA_ID ) ) { echo ''; } }// ============================================================================= // Konec pluginu // ============================================================================= ID ); } if ($slug === FINANCNI_LOGIN_PAGE_SLUG) { return wp_login_url( financni_get_page_url_by_slug( FINANCNI_ACCOUNT_PAGE_SLUG ) ); } if ($slug === FINANCNI_REGISTER_PAGE_SLUG && get_option('users_can_register')) { return wp_registration_url(); } if ($slug === FINANCNI_ACCOUNT_PAGE_SLUG) { return home_url('/'); } if ($slug === FINANCNI_ADD_AD_PAGE_SLUG) { return '#'; } return home_url('/'); } // ============================================================================= // 1. Registrace CPT 'financni_inzerat' // ============================================================================= function financni_inzerce_register_post_type() { $labels = [ 'name' => _x( 'Finanční Inzeráty', 'Post Type General Name', 'financni-inzerce' ), 'singular_name' => _x( 'Finanční Inzerát', 'Post Type Singular Name', 'financni-inzerce' ), 'menu_name' => __( 'Finanční Inzeráty', 'financni-inzerce' ), /* ... další ... */ 'filter_items_list' => __( 'Filtrovat Seznam Inzerátů', 'financni-inzerce' ), ]; $args = [ 'label' => __( 'Finanční Inzerát', 'financni-inzerce' ), 'description' => __( 'Inzeráty finančních produktů', 'financni-inzerce' ), 'labels' => $labels, 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields', 'excerpt', 'author' ], 'taxonomies' => [], 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'menu_icon' => 'dashicons-list-view', 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'post', 'rewrite' => [ 'slug' => 'financni-inzeraty', 'with_front' => true ], 'show_in_rest' => true, ]; register_post_type( 'financni_inzerat', $args ); } add_action( 'init', 'financni_inzerce_register_post_type', 0 ); // ============================================================================= // 2. Meta Boxy pro Inzeráty // ============================================================================= function financni_inzerce_add_meta_box() { add_meta_box( 'financni_inzerce_details_meta_box', __( 'Detaily Inzerátu', 'financni-inzerce' ), 'financni_inzerce_meta_box_callback', 'financni_inzerat', 'normal', 'high' ); } add_action( 'add_meta_boxes', 'financni_inzerce_add_meta_box' ); function financni_inzerce_meta_box_callback( $post ) { /* ... kód formuláře meta boxu ... */ } // Kód je stejný jako v předchozí verzi function financni_inzerce_save_meta_box_data( $post_id ) { /* ... kód ukládání meta dat ... */ } // Kód je stejný jako v předchozí verzi 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() { /* ... kód formuláře a zpracování ... */ } // Kód je stejný jako v předchozí verzi if(!shortcode_exists('pridat_financni_inzerat')){add_shortcode('pridat_financni_inzerat','financni_inzerce_sidebar_form_shortcode');} // ============================================================================= // 4. Shortcode [zobrazit_financni_inzeraty] - Výpis inzerátů // ============================================================================= function financni_inzerce_display_shortcode($atts){ /* ... kód výpisu inzerátů ... */ } // Kód je stejný jako v předchozí verzi 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){ /* ... kód pro zobrazení detailů ... */ } // Kód je stejný jako v předchozí verzi (s opravou ) 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){ /* ... kód pro nastavení expirace ... */ } // Kód je stejný jako v předchozí verzi 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(){ /* ... kód pro kontrolu expirace a notifikace ... */ } // Kód je stejný jako v předchozí verzi add_action(EXPIRATION_CRON_HOOK,'financni_inzerce_check_expired_ads'); function financni_user_can_edit_own_ad($user_id,$post_id){ /* ... pomocná funkce ... */ } // Kód je stejný jako v předchozí verzi function financni_inzerce_deactivate(){ /* ... kód pro deaktivaci cronu ... */ } // Kód je stejný jako v předchozí verzi 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 register_sidebar( array( 'name' => __( 'Reklama nad obsahem (Rotující)', 'financni-inzerce' ), 'id' => GLOBAL_AD_WIDGET_AREA_ID, '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' => '
', 'after_widget' => '
', 'before_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' => '', ) ); } 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 '
'; dynamic_sidebar( $area_id ); 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;">

{ widget.classList.add('fi-ad-rotator-slide'); if (index === currentWidgetIndex) { widget.style.display = 'block'; setTimeout(() => { widget.style.opacity = 1; widget.classList.add('fi-active-slide'); }, 50); } else { widget.style.display = 'none'; widget.style.opacity = 0; widget.classList.remove('fi-active-slide'); } }); setInterval(() => { const currentWidget = widgets[currentWidgetIndex]; if (!currentWidget) return; let nextWidgetIndex = (currentWidgetIndex + 1) % widgets.length; const nextWidget = widgets[nextWidgetIndex]; if (!nextWidget) return; currentWidget.style.opacity = 0; currentWidget.classList.remove('fi-active-slide'); setTimeout(() => { currentWidget.style.display = 'none'; nextWidget.style.display = 'block'; setTimeout(() => { nextWidget.style.opacity = 1; nextWidget.classList.add('fi-active-slide'); }, 50); currentWidgetIndex = nextWidgetIndex; }, fadeDuration); }, interval); } const allRotatorContainers = document.querySelectorAll('.financni-ad-rotator-container'); allRotatorContainers.forEach(container => { initAdRotator(container); }); }); "; wp_add_inline_script( $inline_script_handle, $rotator_js ); } add_action( 'wp_enqueue_scripts', 'financni_enqueue_frontend_scripts_styles' ); // ============================================================================= // 18. Shortcode pro zobrazení rotátoru (v2.1.2+) // ============================================================================= function financni_rotator_shortcode_handler( $atts ) { $atts = shortcode_atts( array( 'oblast' => GLOBAL_AD_WIDGET_AREA_ID, 'interval' => 4000, 'selektor' => '.financni-global-ad-widget' ), $atts, 'zobrazit_rotator' ); if ( $atts['oblast'] === FOOTER_AD_WIDGET_AREA_ID ) { if ( $atts['interval'] == 4000 ) { $atts['interval'] = 6000; } if ( $atts['selektor'] === '.financni-global-ad-widget' ) { $atts['selektor'] = '.financni-footer-ad-widget'; } } if ( function_exists( 'financni_inzerce_display_ad_rotator' ) ) { ob_start(); financni_inzerce_display_ad_rotator( sanitize_key($atts['oblast']), intval($atts['interval']), sanitize_text_field($atts['selektor']) ); return ob_get_clean(); } else { return ''; } } add_shortcode( 'zobrazit_rotator', 'financni_rotator_shortcode_handler' ); // ============================================================================= // Konec pluginu // ============================================================================= ---------------------------------------------------- ---------------------------------------------------------------------------- ---------------------------------------------------------------------- ID ); } if ($slug === FINANCNI_LOGIN_PAGE_SLUG) { return wp_login_url( financni_get_page_url_by_slug( FINANCNI_ACCOUNT_PAGE_SLUG ) ); } if ($slug === FINANCNI_REGISTER_PAGE_SLUG && get_option('users_can_register')) { return wp_registration_url(); } if ($slug === FINANCNI_ACCOUNT_PAGE_SLUG) { return home_url('/'); } if ($slug === FINANCNI_ADD_AD_PAGE_SLUG) { return '#'; } return home_url('/'); } // ============================================================================= // 1. Registrace CPT 'financni_inzerat' // ============================================================================= function financni_inzerce_register_post_type() { $labels = [ 'name' => _x( 'Finanční Inzeráty', 'Post Type General Name', 'financni-inzerce' ), 'singular_name' => _x( 'Finanční Inzerát', 'Post Type Singular Name', 'financni-inzerce' ), 'menu_name' => __( 'Finanční Inzeráty', 'financni-inzerce' ), 'name_admin_bar' => __( 'Finanční Inzerát', 'financni-inzerce' ), 'archives' => __( 'Archiv Inzerátů', 'financni-inzerce' ), 'attributes' => __( 'Atributy Inzerátu', 'financni-inzerce' ), 'parent_item_colon' => __( 'Nadřazený Inzerát:', 'financni-inzerce' ), 'all_items' => __( 'Všechny Inzeráty', 'financni-inzerce' ), 'add_new_item' => __( 'Přidat Nový Inzerát', 'financni-inzerce' ), 'add_new' => __( 'Přidat Nový', 'financni-inzerce' ), 'new_item' => __( 'Nový Inzerát', 'financni-inzerce' ), 'edit_item' => __( 'Upravit Inzerát', 'financni-inzerce' ), 'update_item' => __( 'Aktualizovat Inzerát', 'financni-inzerce' ), 'view_item' => __( 'Zobrazit Inzerát', 'financni-inzerce' ), 'view_items' => __( 'Zobrazit Inzeráty', 'financni-inzerce' ), 'search_items' => __( 'Hledat Inzerát', 'financni-inzerce' ), 'not_found' => __( 'Nenalezeno', 'financni-inzerce' ), 'not_found_in_trash' => __( 'Nenalezeno v Koši', 'financni-inzerce' ), 'featured_image' => __( 'Obrázek Inzerátu', 'financni-inzerce' ), 'set_featured_image' => __( 'Nastavit Obrázek Inzerátu', 'financni-inzerce' ), 'remove_featured_image' => __( 'Odebrat Obrázek Inzerátu', 'financni-inzerce' ), 'use_featured_image' => __( 'Použít jako Obrázek Inzerátu', 'financni-inzerce' ), 'insert_into_item' => __( 'Vložit do Inzerátu', 'financni-inzerce' ), 'uploaded_to_this_item' => __( 'Nahráno k tomuto Inzerátu', 'financni-inzerce' ), 'items_list' => __( 'Seznam Inzerátů', 'financni-inzerce' ), 'items_list_navigation' => __( 'Navigace Seznamu Inzerátů', 'financni-inzerce' ), 'filter_items_list' => __( 'Filtrovat Seznam Inzerátů', 'financni-inzerce' ), ]; $args = [ 'label' => __( 'Finanční Inzerát', 'financni-inzerce' ), 'description' => __( 'Inzeráty finančních produktů', 'financni-inzerce' ), 'labels' => $labels, 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields', 'excerpt', 'author' ], 'taxonomies' => [], 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'menu_icon' => 'dashicons-list-view', 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'post', 'rewrite' => [ 'slug' => 'financni-inzeraty', 'with_front' => true ], 'show_in_rest' => true, ]; register_post_type( 'financni_inzerat', $args ); } add_action( 'init', 'financni_inzerce_register_post_type', 0 ); // ============================================================================= // 2. Meta Boxy pro Inzeráty // ============================================================================= function financni_inzerce_add_meta_box() { add_meta_box( 'financni_inzerce_details_meta_box', __( 'Detaily Inzerátu', 'financni-inzerce' ), 'financni_inzerce_meta_box_callback', 'financni_inzerat', 'normal', 'high' ); } add_action( 'add_meta_boxes', 'financni_inzerce_add_meta_box' ); function financni_inzerce_meta_box_callback( $post ) { wp_nonce_field( 'financni_inzerce_save_meta_box_data', 'financni_inzerce_meta_box_nonce' ); $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 ); $delka = get_post_meta( $post->ID, META_DELKA, true ); $typ_inzeratu = get_post_meta( $post->ID, META_TYP_INZERATU, true ); ?> .fi-meta-box-table{width:100%;border-collapse:collapse;margin-top:10px}.fi-meta-box-table th,.fi-meta-box-table td{padding:10px 5px;text-align:left;vertical-align:top;border-bottom:1px solid #eee}.fi-meta-box-table th{width:25%;font-weight:600}.fi-meta-box-table td input[type=text],.fi-meta-box-table td input[type=email],.fi-meta-box-table td input[type=tel],.fi-meta-box-table td select{width:100%;max-width:400px;padding:5px}.fi-meta-box-table small{color:#666;display:block;margin-top:5px}.fi-required-label{color:#d63638;font-weight:700}.fi-meta-box-table td label{display:inline-block;margin-right:15px}.fi-meta-box-table td p.error{color:#d63638;margin:5px 0 0;font-size:.9em}
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.=''.sprintf(__("Typ: %s",'financni-inzerce'),($typ_inzeratu=='nabidka'?__('Nabídka','financni-inzerce'):__('Poptávka','financni-inzerce'))).'';if($typ_produktu){$output.=''.sprintf(__('Produkt: %s','financni-inzerce'),esc_html(ucfirst($typ_produktu))).'';}$output.=''.sprintf(__('Vloženo: %s','financni-inzerce'),get_the_date()).'';$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);?>
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').'';}?>
'.__('Zatím jste nevložili žádné inzeráty.','financni-inzerce').'';endif;?>[['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;">'failed','reason'=>$reason],$redirect_url));exit;}$account_url=financni_get_page_url_by_slug(FINANCNI_ACCOUNT_PAGE_SLUG);wp_safe_redirect($account_url);exit;}} add_action('admin_init','financni_block_admin_access'); // ============================================================================= // 17. Načtení stylů a inline skriptu pro rotátory (v2.1.0 - Více rotátorů) // ============================================================================= function financni_enqueue_frontend_scripts_styles() { // ---- Inline CSS pro zbytek pluginu + Orámování rotátoru ---- $custom_css = " /* === Základní styly (formuláře, zprávy, atd.) === */ .financni-form-container { border: 1px solid #e0e0e0; padding: 20px; margin-bottom: 20px; background-color: #f9f9f9; border-radius: 5px; } .financni-form-container h3, .financni-form-container h4 { margin-top: 0; border-bottom: 1px solid #eee; padding-bottom: 10px; margin-bottom: 15px; } .financni-form-container p { margin-bottom: 15px; } .financni-form-container label { display: block; margin-bottom: 5px; font-weight: bold; } /* ... (VŠECHNA OSTATNÍ CSS PRAVIDLA Z PŘEDCHOZÍ VERZE) ... */ .button-primary:hover { background: #135e96; border-color: #135e96; color: #fff; } /* === Styly pro Rotátor Reklamy (včetně orámování) === */ .financni-ad-rotator-container { position: relative; /* Nutné pro správné fungování */ overflow: hidden; /* Skryje případný přetékající obsah */ border: 1px solid #ccc; /* Orámování */ padding: 5px; /* Malý vnitřní okraj od rámečku */ margin-bottom: 1em; /* Odsazení pod rotátorem */ min-height: 50px; /* Minimální výška, aby nekolaboval, když je prázdný */ } .fi-ad-rotator-slide { /* Společná třída pro všechny slidy */ display: none; /* Všechny jsou defaultně skryté */ opacity: 0; transition: opacity 0.5s ease-in-out; /* Plynulý přechod pro opacity (0.5s) */ width: 100%; /* Zajistí plnou šířku */ text-align: center; /* Vycentrování obsahu */ box-sizing: border-box; /* Aby padding neovlivnil šířku */ } .fi-ad-rotator-slide.fi-active-slide { display: block; /* Aktivní slide je zobrazen */ /* Opacity nastavuje JS pro animaci */ } "; // Určení handle pro navázání inline stylů a skriptů $inline_script_handle = 'financni-inline-dependencies'; // Název pro náš handle $inline_style_handle = $inline_script_handle; // Můžeme použít stejný wp_register_script($inline_script_handle, false); wp_enqueue_script($inline_script_handle); if (wp_style_is('wp-block-library', 'enqueued')) { wp_add_inline_style( 'wp-block-library', $custom_css ); } else { // Fallback: registrace a načtení vlastního (prázdného) stylu pro navázání wp_register_style( $inline_style_handle, false ); wp_enqueue_style( $inline_style_handle ); wp_add_inline_style( $inline_style_handle, $custom_css ); } // ---- Inline JavaScript pro rotátor reklamy (Upraveno pro více instancí) ---- $rotator_js = " document.addEventListener('DOMContentLoaded', function() { // Funkce pro inicializaci jednoho rotátoru function initAdRotator(containerElement) { const areaId = containerElement.dataset.areaId || 'unknown'; // Pro debugování const interval = parseInt(containerElement.dataset.interval, 10) || 4000; // Výchozí 4s const widgetSelector = containerElement.dataset.widgetSelector || '.widget'; // Obecnější selektor const fadeDuration = 500; // Ponecháme 0.5s fade const widgets = containerElement.querySelectorAll(widgetSelector); if (widgets.length <= 1) { // Pokud je jen jeden widget, zobrazíme ho staticky a bez rotace if (widgets.length === 1) { widgets[0].classList.add('fi-ad-rotator-slide'); // Přidáme třídu pro styl widgets[0].classList.add('fi-active-slide'); // A aktivní třídu widgets[0].style.display = 'block'; widgets[0].style.opacity = 1; } // console.log(`Rotator for area '\${areaId}' skipped (widgets: \${widgets.length})`); return; // Není co rotovat nebo jen jeden } // console.log(`Initializing rotator for area '\${areaId}' (widgets: \${widgets.length}, interval: \${interval})`); let currentWidgetIndex = 0; // Připravit widgety: skrýt všechny kromě prvního a přidat třídu widgets.forEach((widget, index) => { widget.classList.add('fi-ad-rotator-slide'); if (index === currentWidgetIndex) { widget.style.display = 'block'; setTimeout(() => { widget.style.opacity = 1; widget.classList.add('fi-active-slide'); }, 50); } else { widget.style.display = 'none'; widget.style.opacity = 0; widget.classList.remove('fi-active-slide'); } }); // Spustit samotnou rotaci pro tento kontejner setInterval(() => { const currentWidget = widgets[currentWidgetIndex]; if (!currentWidget) return; // Pojistka let nextWidgetIndex = (currentWidgetIndex + 1) % widgets.length; const nextWidget = widgets[nextWidgetIndex]; if (!nextWidget) return; // Pojistka currentWidget.style.opacity = 0; currentWidget.classList.remove('fi-active-slide'); setTimeout(() => { currentWidget.style.display = 'none'; nextWidget.style.display = 'block'; setTimeout(() => { nextWidget.style.opacity = 1; nextWidget.classList.add('fi-active-slide'); }, 50); currentWidgetIndex = nextWidgetIndex; }, fadeDuration); }, interval); // Použijeme interval specifický pro tento rotátor } // Najít všechny kontejnery rotátorů na stránce a inicializovat je const allRotatorContainers = document.querySelectorAll('.financni-ad-rotator-container'); allRotatorContainers.forEach(container => { initAdRotator(container); }); }); "; // Přidání inline JavaScriptu k našemu handle wp_add_inline_script( $inline_script_handle, $rotator_js ); } // Registrace upravené funkce pro načítání skriptů a stylů add_action( 'wp_enqueue_scripts', 'financni_enqueue_frontend_scripts_styles' ); // ============================================================================= // Konec pluginu // ==================================================================== Rychlá půjčka Kdy se zajímat o rychlou půjčku. Jistě jste se setkali s nabídkou rychlé půjčky- objevují se v tisku, inzerci, útočí v televizní i internetové reklamě. Podle popisu by se mělo jednat o půjčku, která je vhodná pro každého zájemce a její poskytnutí i průběh jsou bezproblémové. Je tomu opravdu tak nebo se u rychlé půjčky můžete setkat s obvyklými úskalími, které sebou půjčování peněz přináší? Kdo by se měl o tento typ půjčky zajímat a kdo by se mu měl naopak vyhnout? Jaké parametry má rychlá půjčka a jak vlastně celý proces probíhá? Komu je rychlá půjčka určena Rychlá půjčka je určena těm zájemcům, kteří potřebují získat menší obnos opravdu rychle, a současně vědí, že ho v krátké době (do jednoho měsíce) budou schopni vrátit. Nejedná se o půjčku dlouhodobou, splácení je jednorázové a zapůjčená obnos by tedy měl být spíše momentální výpomocí. Využití takto získaných financí je zcela na vaší vůli – na zakoupení dosloužilého spotřebiče, opravu auta nebo výhodný či nutný nákup, na doplacení dovolené – záleží opravdu jen na vás, jak peníze použijete. Výhody a nevýhody těchto půjček Rychlá půjčka má samozřejmě jak klady, tak zápory. K největším výhodám patří to, že je opravdu rychlá, potřebné finance můžete získat i během několika minut. Je také dostupná většině žadatelů. Jednoduchost a pohodlí – to jsou další výrazné znaky rychlé půjčky. Požádat totiž můžete online z pohodlí své domácnosti a v kteroukoli denní i noční dobu. Za pohodlí, rychlost a jednoduchost se však platí – v případě rychlých půjček jde o vyšší úroky nebo poplatky za poskytnutí půjčky a velmi krátkou dobu splatnosti, většinou do jednoho měsíce. Někteří poskytovatelé však nabízejí první půjčku zdarma, proto se vyplatí pečlivě vybírat. Jak si sjednat rychlou půjčku Vše je velice jednoduché a nekomplikované. Vyberete si vhodného poskytovatele a na jeho webových stránkách vyplníte formulář s žádostí. Pak počkáte na vyhodnocení žádosti, odsouhlasíte zvolenou částku a termín splatnosti a potvrdíte. Během několika minut nebo hodin můžete očekávat zapůjčenou částku na svém účtu, záleží na vaší bance a bance poskytovatele. Pokud se vám stane, že byste půjčku nemohli v termínu splatit, umožňuje většina poskytovatelů odložení termínu splatnosti – samozřejmě za další poplatek.


Rychlá půjčka - Vyřízení snadno a Online