array( 'callback' => 'awpcp_do_placeholder_title', ), 'ad_categoryurl' => array( 'callback' => 'awpcp_do_placeholder_category_url', ), 'ad_categoryname' => array( 'callback' => 'awpcp_do_placeholder_category_name', ), 'adcontact_name' => array( 'callback' => 'awpcp_do_placeholder_contact_name', ), 'adcontactphone' => array( 'callback' => 'awpcp_do_placeholder_contact_phone', ), 'codecontact' => array( 'callback' => 'awpcp_do_placeholder_contact_url', ), 'awpcpvisitwebsite' => array( 'callback' => 'awpcp_do_placeholder_website_link', ), 'addetails' => array( 'callback' => 'awpcp_do_placeholder_details', ), 'location' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'city' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'state' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'village' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'country' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'aditemprice' => array( 'callback' => 'awpcp_do_placeholder_price', ), 'ad_startdate' => array( 'callback' => 'awpcp_do_placeholder_legacy_dates', ), 'ad_postdate' => array( 'callback' => 'awpcp_do_placeholder_legacy_dates', ), 'featureimg' => array( 'callback' => 'awpcp_do_placeholder_images', ), 'awpcpshowadotherimages' => array( 'callback' => 'awpcp_do_placeholder_images', ), 'awpcpextrafields' => array( 'callback' => 'awpcp_do_placeholder_extra_fields', ), 'showadsense1' => array( 'callback' => 'awpcp_do_placeholder_adsense', ), 'showadsense2' => array( 'callback' => 'awpcp_do_placeholder_adsense', ), 'showadsense3' => array( 'callback' => 'awpcp_do_placeholder_adsense', ), 'awpcpadviews' => array( 'callback' => 'awpcp_do_placeholder_legacy_views', ), 'flagad' => array( 'callback' => 'awpcp_do_placeholder_flag_link', ), 'tweetbtn' => array( 'callback' => 'awpcp_do_placeholder_twitter_button', ), 'sharebtn' => array( 'callback' => 'awpcp_do_placeholder_facebook_button', ), // listings [only] placeholders 'url_showad' => array( 'callback' => 'awpcp_do_placeholder_url', ), 'addetailssummary' => array( 'callback' => 'awpcp_do_placeholder_excerpt', ), 'awpcp_city_display' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'awpcp_state_display' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'awpcp_country_display' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'awpcp_display_price' => array( 'callback' => 'awpcp_do_placeholder_price', ), 'awpcpadpostdate' => array( 'callback' => 'awpcp_do_placeholder_legacy_dates', ), 'imgblockwidth' => array( 'callback' => 'awpcp_do_placeholder_images', ), 'awpcp_image_name_srccode' => array( 'callback' => 'awpcp_do_placeholder_images', ), 'awpcp_display_adviews' => array( 'callback' => 'awpcp_do_placeholder_legacy_views', ), ); /* new placeholders added in AWPCP 3.0 */ $placeholders = array( // common placeholders 'url' => array(), 'title' => array(), 'title_link' => array( 'callback' => 'awpcp_do_placeholder_title', ), 'category_url' => array(), // 'category_link' => array(), 'category_name' => array(), 'parent_category_url' => array(), 'parent_category_name' => array(), 'categories' => array(), 'details' => array(), 'excerpt' => array(), 'contact_name' => array(), 'contact_phone' => array( 'callback' => 'awpcp_do_placeholder_contact_phone', ), 'contact_url' => array(), 'website_link' => array(), 'website_url' => array(), // 'city' => array(), // 'state' => array(), // 'country' => array(), 'county' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'region' => array( 'callback' => 'awpcp_do_placeholder_location', ), 'price' => array(), 'start_date' => array( 'callback' => 'awpcp_do_placeholder_dates', ), 'end_date' => array( 'callback' => 'awpcp_do_placeholder_dates', ), 'posted_date' => array( 'callback' => 'awpcp_do_placeholder_dates', ), 'last_updated_date' => array( 'callback' => 'awpcp_do_placeholder_dates', ), 'renewed_date' => array( 'callback' => 'awpcp_do_placeholder_dates', ), 'featured_image' => array( 'callback' => 'awpcp_do_placeholder_images', ), 'views' => array(), 'extra_fields' => array( 'callback' => 'awpcp_do_placeholder_extra_fields', ), 'twitter_button' => array(), 'twitter_button_url' => array(), 'facebook_button' => array(), 'facebook_button_url' => array(), // single ad [only] placeholders 'images' => array(), 'adsense' => array(), 'flag_link' => array(), // listings [only] placeholders 'thumbnail_width' => array( 'callback' => 'awpcp_do_placeholder_images', ), ); $placeholders = array_merge($legacy_placeholders, $placeholders); $placeholders = apply_filters('awpcp-content-placeholders', $placeholders); foreach ($placeholders as $placeholder => $params) { if (!isset($placeholders[$placeholder]['callback'])) { $placeholders[$placeholder]['callback'] = "awpcp_do_placeholder_{$placeholder}"; } } krsort($placeholders); return $placeholders; } /** * @since 3.0 */ function awpcp_do_placeholders($ad, $content, $context) { $placeholders = awpcp_content_placeholders(); $placeholders_names = array_keys($placeholders); return awpcp_replace_placeholders( $placeholders_names, $ad, $content, $context ); } /** * @since 3.6.4 */ function awpcp_replace_placeholders( $placeholders, $listing, $content, $context ) { $original_content = $content; // remove old $quers/ placeholders $content = str_replace('$quers/', '', $content); $pattern = sprintf('\$%s', join('|\$', array_map('preg_quote', $placeholders))); preg_match_all("/$pattern/s", $content, $matches); $available_placeholders = awpcp_content_placeholders(); $processed_placeholders = array(); foreach ($matches[0] as $match) { if (isset($processed_placeholders[$match])) continue; $placeholder = trim($match, '$'); $callback = $available_placeholders[$placeholder]['callback']; if ( is_callable( $callback ) ) { $replacement = call_user_func($callback, $listing, $placeholder, $context); $content = str_replace($match, $replacement, $content); $processed_placeholders[$match] = true; } else { } } return $content; } /** * @since 3.0 */ function awpcp_do_placeholder_url($ad, $placeholder) { return esc_url( awpcp_listing_renderer()->get_view_listing_url( $ad ) ); } /** * @since 3.0 */ function awpcp_do_placeholder_title($ad, $placeholder) { $url = awpcp_listing_renderer()->get_view_listing_url( $ad ); $replacements['ad_title'] = sprintf( '%s', esc_attr( $url ), esc_html( $ad->get_title() ) ); $replacements['title'] = esc_html( $ad->get_title() ); $replacements['title_link'] = $replacements['ad_title']; return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_category_name($ad, $placeholder) { return esc_html( stripslashes( get_adcatname( $ad->ad_category_id ) ) ); } /** * @since 3.0 */ function awpcp_do_placeholder_category_url($ad, $placeholder) { return awpcp_get_browse_category_url_from_id( $ad->ad_category_id ); } /** * @since 3.2 */ function awpcp_do_placeholder_parent_category_name( $ad, $placeholder ) { return esc_html( stripslashes( get_adcatname( $ad->ad_category_parent_id ) ) ); } /** * @since 3.2 */ function awpcp_do_placeholder_parent_category_url( $ad, $placeholder ) { return awpcp_get_browse_category_url_from_id( $ad->ad_category_parent_id ); } /** * @since 3.3 */ function awpcp_do_placeholder_categories( $listing, $placeholder ) { $categories_ids = array_filter( array( $listing->ad_category_id, $listing->ad_category_parent_id ) ); $categories = awpcp_categories_collection()->find( array( 'id' => $categories_ids ) ); $links = array( 'parent-category' => '', 'category' => '' ); foreach ( $categories as $category ) { if ( $listing->ad_category_parent_id == $category->id ) { $category_type = 'parent-category'; } else { $category_type = 'category'; } $link = ''; $link = str_replace( '', esc_attr( url_browsecategory( $category ), $link ) ); $link = str_replace( '', esc_html( $category->name ), $link ); $links[ $category_type ] = $link; } $output = ''; $output = str_replace( '', implode( ' / ', array_filter( $links ) ), $output ); return $output; } /** * @since 3.0 */ function awpcp_do_placeholder_details($ad, $placeholder) { static $replacements = array(); if (isset($replacements[$ad->ad_id])) { return $replacements[$ad->ad_id][$placeholder]; } $placeholders['addetails'] = apply_filters('awpcp-ad-details', stripslashes_deep($ad->ad_details)); if (get_awpcp_option('hyperlinkurlsinadtext')) { $pattern = '#(?$1', $nofollow); $placeholders['addetails'] = preg_replace($pattern, $link, $placeholders['addetails']); } $placeholders['addetails'] = nl2br($placeholders['addetails']); $placeholders['details'] = $placeholders['addetails']; $replacements[$ad->ad_id] = $placeholders; return $replacements[$ad->ad_id][$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_excerpt($ad, $placeholder) { $word_count = get_awpcp_option( 'words-in-listing-excerpt' ); $details = stripslashes( $ad->ad_details ); $replacements['addetailssummary'] = wp_trim_words( $details, $word_count, '' ); $replacements['excerpt'] = wp_trim_words( $details, $word_count ); return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_contact_name($ad, $placeholder) { if ( get_awpcp_option( 'hidelistingcontactname' ) == 1 && ! is_user_logged_in() ) { $contact_name = __( 'Seller', 'another-wordpress-classifieds-plugin' ); } else { $contact_name = $ad->ad_contact_name; } return esc_html( stripslashes( $contact_name ) ); } /** * @since 3.0 */ function awpcp_do_placeholder_website_url($ad, $placeholder) { return $ad->websiteurl; } /** * @since 3.0 */ function awpcp_do_placeholder_website_link($ad, $placeholder) { if ( ( get_awpcp_option( 'displaywebsitefieldreqpriv' ) != 1 || is_user_logged_in() ) && !empty( $ad->websiteurl ) ) { $nofollow = get_awpcp_option('visitwebsitelinknofollow') ? 'rel="nofollow"' : ''; $escaped_label = esc_html( __( 'Visit Website', 'another-wordpress-classifieds-plugin' ) ); $escaped_url = awpcp_esc_attr( $ad->websiteurl ); $content = '
%s'; $content = sprintf( $content, $nofollow, $escaped_url, $escaped_label ); $replacements['awpcpvisitwebsite'] = $content; $content = '%s'; $content = sprintf( $content, $nofollow, $escaped_url, $escaped_label ); $replacements['website_link'] = $content; } else { $replacements['awpcpvisitwebsite'] = ''; $replacements['website_link'] = ''; } return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_price($ad, $placeholder) { $price = empty($ad->ad_item_price) ? 0 : ($ad->ad_item_price / 100); $show_price_field = get_awpcp_option( 'displaypricefield' ) == 1; $user_can_see_price_field = is_user_logged_in() || get_awpcp_option( 'price-field-is-restricted' ) == 0; if ( get_awpcp_option( 'hide-price-field-if-empty' ) && $price <= 0 ) { $show_price_field = false; } $replacements = array(); if ( $show_price_field && $user_can_see_price_field && $price >= 0 ) { $escaped_label = esc_html( __( 'Price', 'another-wordpress-classifieds-plugin' ) ); $escaped_currency = esc_html( awpcp_format_money( $price ) ); // single ad $content = '
: %s
'; $replacements['aditemprice'] = sprintf($content, $escaped_label, $escaped_currency); // listings $replacements['awpcp_display_price'] = sprintf('%s: %s', $escaped_label, $escaped_currency); $replacements['price'] = $escaped_currency; } return awpcp_array_data( $placeholder, '', $replacements ); } /** * @since 3.0 */ function awpcp_do_placeholder_dates($ad, $placeholder) { $replacements['start_date'] = awpcp_datetime( 'awpcp-date', $ad->ad_startdate ); $replacements['end_date'] = awpcp_datetime( 'awpcp-date', $ad->ad_enddate ); $replacements['posted_date'] = awpcp_datetime( 'awpcp-date', $ad->ad_postdate ); $replacements['last_updated_date'] = awpcp_datetime( 'awpcp-date', $ad->ad_last_updated ); if ( ! empty( $ad->renewed_date ) ) { $replacements['renewed_date'] = awpcp_datetime( 'awpcp-date', $ad->renewed_date ); } else { $replacements['renewed_date'] = awpcp_datetime( 'awpcp-date', $ad->ad_postdate ); } return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_images($ad, $placeholder) { return awpcp_image_placeholders()->do_image_placeholders( $ad, $placeholder ); } /** * @since 3.0 */ function awpcp_do_placeholder_views($ad, $placeholder) { return $ad->ad_views; } /** * @since 3.0 */ function awpcp_do_placeholder_legacy_dates($ad, $placeholder) { $replacements['ad_startdate'] = awpcp_datetime( 'awpcp-date', $ad->ad_startdate ); $replacements['ad_postdate'] = awpcp_datetime( 'awpcp-date', $ad->ad_postdate ); $replacements['awpcpadpostdate'] = sprintf('%s
', $replacements['ad_postdate']); return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_location($ad, $placeholder) { $regions = AWPCP_Ad::get_ad_regions_names( $ad->ad_id ); $cities = array(); $states = array(); $villages = array(); $countries = array(); $places = array(); if ( get_awpcp_option( 'show-city-field-before-county-field' ) ) { $order = array( 'country', 'state', 'city', 'county' ); } else { $order = array( 'country', 'state', 'county', 'city' ); } foreach ( $regions as $region ) { if ( !empty( $region['city'] ) ) { $cities[] = stripslashes_deep( $region['city'] ); } if ( !empty( $region['county'] ) ) { $villages[] = stripslashes_deep( $region['county'] ); } if ( !empty( $region['state'] ) ) { $states[] = stripslashes_deep( $region['state'] ); } if ( !empty( $region['country'] ) ) { $countries[] = stripslashes_deep( $region['country'] ); } $place = array(); foreach( $order as $field ) { if ( ! empty( $region[ $field ] ) ) { $place[] = stripslashes_deep( $region[ $field ] ); } } $places[] = $place; } if ( !empty( $cities ) ) { $replacements['city'] = join( ', ', $cities ); } if ( !empty( $states ) ) { $replacements['state'] = join( ', ', $states ); } if ( !empty( $villages ) ) { $replacements['county'] = join( ', ', $villages ); $replacements['village'] = $replacements['county']; } if ( !empty( $countries ) ) { $replacements['country'] = join( ', ', $countries ); } $location = array(); foreach ( $places as $place ) { $location[] = join( ', ', $place ); } $location = join( '; ', $location ); if ( !empty( $location ) ) { $replacements['location'] = sprintf( '
: %s', __( 'Location', 'another-wordpress-classifieds-plugin' ), $location ); $replacements['region'] = $location; } else { $replacements['location'] = ''; $replacements['region'] = ''; } if (!empty($replacements['city'])) { $replacements['awpcp_city_display'] = sprintf('%s
', $replacements['city']); } else { $replacements['awpcp_city_display'] = ''; } if (!empty($replacements['state'])) { $replacements['awpcp_state_display'] = sprintf('%s
', $replacements['state']); } else { $replacements['awpcp_state_display'] = ''; } if (!empty($replacements['country'])) { $replacements['awpcp_country_display'] = sprintf('%s
', $replacements['country']); } else { $replacements['awpcp_country_display'] = ''; } return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_legacy_views($ad, $placeholder) { if (get_awpcp_option('displayadviews')) { // single ad $views = get_numtimesadviewd($ad->ad_id); $text = _n('This Ad has been viewed %d time.', 'This Ad has been viewed %d times.', $views, 'another-wordpress-classifieds-plugin'); $replacements['awpcpadviews'] = sprintf('
%s
', sprintf($text, $views)); // listings $content = sprintf(__('Total views: %d', 'another-wordpress-classifieds-plugin'), $views); $replacements['awpcp_display_adviews'] = sprintf('%s
', $content); } else { $replacements['awpcpadviews'] = ''; $replacements['awpcp_display_adviews'] = ''; } return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_extra_fields($ad, $placeholder, $context) { global $hasextrafieldsmodule; if ($hasextrafieldsmodule == 1) { $single = $context === 'single' ? true : false; $replacements['awpcpextrafields'] = display_x_fields_data( $ad->ad_id, $single ); } else { $replacements['awpcpextrafields'] = ''; } $replacements['extra_fields'] = $replacements['awpcpextrafields']; return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_contact_url($ad, $placeholder) { return awpcp_get_reply_to_ad_url($ad->ad_id, $ad->ad_title); } /** * @since 3.0 */ function awpcp_do_placeholder_contact_phone($ad, $placeholder) { if (!empty($ad->ad_contact_phone)) { $phone = $ad->ad_contact_phone; if ( get_awpcp_option( 'displayphonefieldpriv') == 1 && !is_user_logged_in() ) { $allowed = intval( strlen( $phone ) * 0.4 ); $phone = substr($phone, 0, $allowed) . str_repeat('X', strlen( $phone ) - $allowed ); } $content = sprintf( '
: %s', __('Phone', 'another-wordpress-classifieds-plugin'), $phone ); $replacements['adcontactphone'] = $content; $replacements['contact_phone'] = $phone; } else { $replacements['adcontactphone'] = ''; $replacements['contact_phone'] = ''; } return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_adsense($ad, $placeholder) { static $replacements = array(); if (isset($replacements[$ad->ad_id])) { return $replacements[$ad->ad_id][$placeholder]; } if (get_awpcp_option('useadsense')) { $content = '
%s
'; $placeholders['adsense'] = sprintf($content, get_awpcp_option('adsense')); } else { $placeholders['adsense'] = ''; } $placeholders['showadsense1'] = ''; $placeholders['showadsense2'] = ''; $placeholders['showadsense3'] = ''; switch (get_awpcp_option('adsenseposition')) { case 1: $placeholders['showadsense1'] = $placeholders['adsense']; break; case 2: $placeholders['showadsense2'] = $placeholders['adsense']; break; case 3: $placeholders['showadsense3'] = $placeholders['adsense']; break; } $replacements[$ad->ad_id] = $placeholders; return $replacements[$ad->ad_id][$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_flag_link($ad, $placeholder) { $content = ''; $replacements['flagad'] = sprintf($content, $ad->ad_id, __('Flag Ad', 'another-wordpress-classifieds-plugin')); $replacements['flag_link'] = $replacements['flagad']; return $replacements[$placeholder]; } /** * @since 3.0 */ function awpcp_do_placeholder_twitter_button($ad, $placeholder) { $url = awpcp_do_placeholder_twitter_button_url( $ad, 'twitter_button_url' ); $button = ''; return $button; } /** * @since 3.2.2 */ function awpcp_do_placeholder_twitter_button_url( $ad, $placeholder ) { $url = awpcp_listing_renderer()->get_view_listing_url( $ad ); return add_query_arg(array( 'url' => urlencode( $url ), 'text' => urlencode($ad->get_title()), ), 'http://twitter.com/share'); } /** * @since 3.0 */ function awpcp_do_placeholder_facebook_button($ad, $placeholder) { $href = awpcp_do_placeholder_facebook_button_url( $ad, 'facebook_button_url' ); $button = '
'; $button.= ''; $button.= '
'; return sprintf($button, $href, __('Share on Facebook', 'another-wordpress-classifieds-plugin')); } /** * @since 3.2.2 */ function awpcp_do_placeholder_facebook_button_url( $ad, $placeholder ) { $info = awpcp_get_ad_share_info( $ad->ad_id ); return sprintf( 'http://www.facebook.com/sharer/sharer.php?u=%s', urlencode( $info['url'] ) ); } /** * @since 3.0 */ function awpcp_replace_content_placeholders($content, $replacements) { $placeholders = awpcp_content_placeholders(); // make sure placeholders with longer names appear first. krsort($replacements); foreach ($replacements as $placeholder => $value) { if (!isset($placeholders[$placeholder])) continue; foreach ($placeholders[$placeholder]['aliases'] as $alias) { $content = str_replace("\${$alias}", "$value", $content); } } return $content; }