Changeset 3464464
- Timestamp:
- 02/18/2026 03:33:30 PM (7 weeks ago)
- Location:
- ad-integration-for-mobile-de-api
- Files:
-
- 155 added
- 5 edited
-
tags/1.2 (added)
-
tags/1.2/assets (added)
-
tags/1.2/assets/css (added)
-
tags/1.2/assets/css/admin.css (added)
-
tags/1.2/assets/css/style.css (added)
-
tags/1.2/assets/img (added)
-
tags/1.2/assets/img/co2class-A-A-de.jpg (added)
-
tags/1.2/assets/img/co2class-A-A-en-2.jpg (added)
-
tags/1.2/assets/img/co2class-A-A-en.jpg (added)
-
tags/1.2/assets/img/co2class-A-B-de.jpg (added)
-
tags/1.2/assets/img/co2class-A-B-en.jpg (added)
-
tags/1.2/assets/img/co2class-A-C-de.jpg (added)
-
tags/1.2/assets/img/co2class-A-C-en.jpg (added)
-
tags/1.2/assets/img/co2class-A-D-de.jpg (added)
-
tags/1.2/assets/img/co2class-A-D-en.jpg (added)
-
tags/1.2/assets/img/co2class-A-E-de.jpg (added)
-
tags/1.2/assets/img/co2class-A-E-en.jpg (added)
-
tags/1.2/assets/img/co2class-A-F-de.jpg (added)
-
tags/1.2/assets/img/co2class-A-F-en.jpg (added)
-
tags/1.2/assets/img/co2class-A-G-de.jpg (added)
-
tags/1.2/assets/img/co2class-A-G-en.jpg (added)
-
tags/1.2/assets/img/co2class-A.jpg (added)
-
tags/1.2/assets/img/co2class-B-A-de.jpg (added)
-
tags/1.2/assets/img/co2class-B-A-en.jpg (added)
-
tags/1.2/assets/img/co2class-B-B-de.jpg (added)
-
tags/1.2/assets/img/co2class-B-B-en.jpg (added)
-
tags/1.2/assets/img/co2class-B-C-de.jpg (added)
-
tags/1.2/assets/img/co2class-B-C-en.jpg (added)
-
tags/1.2/assets/img/co2class-B-D-de.jpg (added)
-
tags/1.2/assets/img/co2class-B-D-en.jpg (added)
-
tags/1.2/assets/img/co2class-B-E-de.jpg (added)
-
tags/1.2/assets/img/co2class-B-E-en.jpg (added)
-
tags/1.2/assets/img/co2class-B-F-de.jpg (added)
-
tags/1.2/assets/img/co2class-B-F-en.jpg (added)
-
tags/1.2/assets/img/co2class-B-G-de.jpg (added)
-
tags/1.2/assets/img/co2class-B-G-en.jpg (added)
-
tags/1.2/assets/img/co2class-B.jpg (added)
-
tags/1.2/assets/img/co2class-C-A-de.jpg (added)
-
tags/1.2/assets/img/co2class-C-A-en.jpg (added)
-
tags/1.2/assets/img/co2class-C-B-de.jpg (added)
-
tags/1.2/assets/img/co2class-C-B-en.jpg (added)
-
tags/1.2/assets/img/co2class-C-C-de.jpg (added)
-
tags/1.2/assets/img/co2class-C-C-en.jpg (added)
-
tags/1.2/assets/img/co2class-C-D-de.jpg (added)
-
tags/1.2/assets/img/co2class-C-D-en.jpg (added)
-
tags/1.2/assets/img/co2class-C-E-de.jpg (added)
-
tags/1.2/assets/img/co2class-C-E-en.jpg (added)
-
tags/1.2/assets/img/co2class-C-F-de.jpg (added)
-
tags/1.2/assets/img/co2class-C-F-en.jpg (added)
-
tags/1.2/assets/img/co2class-C-G-de.jpg (added)
-
tags/1.2/assets/img/co2class-C-G-en.jpg (added)
-
tags/1.2/assets/img/co2class-C.jpg (added)
-
tags/1.2/assets/img/co2class-D-A-de.jpg (added)
-
tags/1.2/assets/img/co2class-D-A-en.jpg (added)
-
tags/1.2/assets/img/co2class-D-B-de.jpg (added)
-
tags/1.2/assets/img/co2class-D-B-en.jpg (added)
-
tags/1.2/assets/img/co2class-D-C-de.jpg (added)
-
tags/1.2/assets/img/co2class-D-C-en.jpg (added)
-
tags/1.2/assets/img/co2class-D-D-de.jpg (added)
-
tags/1.2/assets/img/co2class-D-D-en.jpg (added)
-
tags/1.2/assets/img/co2class-D-E-de.jpg (added)
-
tags/1.2/assets/img/co2class-D-E-en.jpg (added)
-
tags/1.2/assets/img/co2class-D-F-de.jpg (added)
-
tags/1.2/assets/img/co2class-D-F-en.jpg (added)
-
tags/1.2/assets/img/co2class-D-G-de.jpg (added)
-
tags/1.2/assets/img/co2class-D-G-en.jpg (added)
-
tags/1.2/assets/img/co2class-D.jpg (added)
-
tags/1.2/assets/img/co2class-E-A-de.jpg (added)
-
tags/1.2/assets/img/co2class-E-A-en.jpg (added)
-
tags/1.2/assets/img/co2class-E-B-de.jpg (added)
-
tags/1.2/assets/img/co2class-E-B-en.jpg (added)
-
tags/1.2/assets/img/co2class-E-C-de.jpg (added)
-
tags/1.2/assets/img/co2class-E-C-en.jpg (added)
-
tags/1.2/assets/img/co2class-E-D-de.jpg (added)
-
tags/1.2/assets/img/co2class-E-D-en.jpg (added)
-
tags/1.2/assets/img/co2class-E-E-de.jpg (added)
-
tags/1.2/assets/img/co2class-E-E-en.jpg (added)
-
tags/1.2/assets/img/co2class-E-F-de.jpg (added)
-
tags/1.2/assets/img/co2class-E-F-en.jpg (added)
-
tags/1.2/assets/img/co2class-E-G-de.jpg (added)
-
tags/1.2/assets/img/co2class-E-G-en.jpg (added)
-
tags/1.2/assets/img/co2class-E.jpg (added)
-
tags/1.2/assets/img/co2class-F-A-de.jpg (added)
-
tags/1.2/assets/img/co2class-F-A-en.jpg (added)
-
tags/1.2/assets/img/co2class-F-B-de.jpg (added)
-
tags/1.2/assets/img/co2class-F-B-en.jpg (added)
-
tags/1.2/assets/img/co2class-F-C-de.jpg (added)
-
tags/1.2/assets/img/co2class-F-C-en.jpg (added)
-
tags/1.2/assets/img/co2class-F-D-de.jpg (added)
-
tags/1.2/assets/img/co2class-F-D-en.jpg (added)
-
tags/1.2/assets/img/co2class-F-E-de.jpg (added)
-
tags/1.2/assets/img/co2class-F-E-en.jpg (added)
-
tags/1.2/assets/img/co2class-F-F-de.jpg (added)
-
tags/1.2/assets/img/co2class-F-F-en.jpg (added)
-
tags/1.2/assets/img/co2class-F-G-de.jpg (added)
-
tags/1.2/assets/img/co2class-F-G-en.jpg (added)
-
tags/1.2/assets/img/co2class-F.jpg (added)
-
tags/1.2/assets/img/co2class-G-A-de.jpg (added)
-
tags/1.2/assets/img/co2class-G-A-en.jpg (added)
-
tags/1.2/assets/img/co2class-G-B-de.jpg (added)
-
tags/1.2/assets/img/co2class-G-B-en.jpg (added)
-
tags/1.2/assets/img/co2class-G-C-de.jpg (added)
-
tags/1.2/assets/img/co2class-G-C-en.jpg (added)
-
tags/1.2/assets/img/co2class-G-D-de.jpg (added)
-
tags/1.2/assets/img/co2class-G-D-en.jpg (added)
-
tags/1.2/assets/img/co2class-G-E-de.jpg (added)
-
tags/1.2/assets/img/co2class-G-E-en.jpg (added)
-
tags/1.2/assets/img/co2class-G-F-de.jpg (added)
-
tags/1.2/assets/img/co2class-G-F-en.jpg (added)
-
tags/1.2/assets/img/co2class-G-G-de.jpg (added)
-
tags/1.2/assets/img/co2class-G-G-en.jpg (added)
-
tags/1.2/assets/img/co2class-G.jpg (added)
-
tags/1.2/assets/js (added)
-
tags/1.2/assets/js/ajax.js (added)
-
tags/1.2/assets/js/script.js (added)
-
tags/1.2/assets/js/single.js (added)
-
tags/1.2/assets/js/slick (added)
-
tags/1.2/assets/js/slick/ajax-loader.gif (added)
-
tags/1.2/assets/js/slick/fonts (added)
-
tags/1.2/assets/js/slick/fonts/slick.eot (added)
-
tags/1.2/assets/js/slick/fonts/slick.svg (added)
-
tags/1.2/assets/js/slick/fonts/slick.ttf (added)
-
tags/1.2/assets/js/slick/fonts/slick.woff (added)
-
tags/1.2/assets/js/slick/slick-theme.css (added)
-
tags/1.2/assets/js/slick/slick.css (added)
-
tags/1.2/assets/js/slick/slick.js (added)
-
tags/1.2/assets/js/slick/slick.min.css (added)
-
tags/1.2/assets/js/slick/slick.min.js (added)
-
tags/1.2/block (added)
-
tags/1.2/block/elementor (added)
-
tags/1.2/block/elementor/index.php (added)
-
tags/1.2/block/elementor/vehicle-archive.php (added)
-
tags/1.2/block/vehicle-archive (added)
-
tags/1.2/block/vehicle-archive/block.js (added)
-
tags/1.2/block/vehicle-archive/index.php (added)
-
tags/1.2/block/vehicle-archive/style.css (added)
-
tags/1.2/includes (added)
-
tags/1.2/includes/admin (added)
-
tags/1.2/includes/admin/settings.php (added)
-
tags/1.2/includes/admin/single.php (added)
-
tags/1.2/includes/ajax.php (added)
-
tags/1.2/includes/assets.php (added)
-
tags/1.2/includes/cron.php (added)
-
tags/1.2/includes/db (added)
-
tags/1.2/includes/db/create.php (added)
-
tags/1.2/includes/db/drop.php (added)
-
tags/1.2/includes/functions.php (added)
-
tags/1.2/includes/permalinks.php (added)
-
tags/1.2/includes/shortcodes.php (added)
-
tags/1.2/index.html (added)
-
tags/1.2/mobile-api.php (added)
-
tags/1.2/readme.txt (added)
-
tags/1.2/templates (added)
-
tags/1.2/templates/archive-vehicle.php (added)
-
tags/1.2/templates/single-vehicle.php (added)
-
trunk/includes/admin/settings.php (modified) (1 diff)
-
trunk/includes/cron.php (modified) (2 diffs)
-
trunk/includes/functions.php (modified) (3 diffs)
-
trunk/mobile-api.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ad-integration-for-mobile-de-api/trunk/includes/admin/settings.php
r3460286 r3464464 19 19 function() { 20 20 ?> 21 <input name="mobile_api_username" id="mobile_api_username" type="text" value="<?php echo esc_attr( get_option( 'mobile_api_username' ) ) ?>" class="regular-text">21 <input name="mobile_api_username" id="mobile_api_username" type="text" value="<?php echo esc_attr( get_option( 'mobile_api_username' ) ) ?>" placeholder="dlr_" class="regular-text"> 22 22 <?php 23 23 }, -
ad-integration-for-mobile-de-api/trunk/includes/cron.php
r3460286 r3464464 16 16 $url = 'https://services.mobile.de/search-api/search?page.size=100&modificationTime.min='.$last_sync; 17 17 $json = mobile_api_request( $url ); 18 // echo '<pre>'; var_dump( $json ); echo '</pre>';19 18 20 19 foreach ( $json->ads AS $ad ) : … … 22 21 $url = 'https://services.mobile.de/search-api/ad/'.$ad->mobileAdId; 23 22 $json = mobile_api_request( $url ); 24 // echo '<pre>'; var_dump( $json ); echo '</pre>';25 23 26 24 // Check if vehicle already exists -
ad-integration-for-mobile-de-api/trunk/includes/functions.php
r3460286 r3464464 26 26 ) 27 27 ); 28 // echo '<pre>'; print_r( $response ); echo '</pre>';29 28 30 29 if ( is_wp_error( $response ) ) … … 229 228 230 229 function mobile_api_description_to_html( $raw ) { 231 // 1) Grundnormalisierung: Entities, newlines 230 232 231 $text = html_entity_decode( (string) $raw, ENT_QUOTES | ENT_HTML5, 'UTF-8' ); 233 232 $text = str_replace( ["\r\n", "\r"], "\n", $text ); 234 233 235 // 2) Backslash-Markierungen vor Sternen/Headlines: \** oder \* -> Newline + marker (macht aus "...\\* Punkt" => "... \n* Punkt" usw.) 236 $text = preg_replace( '/\\\\+\\*\\*/', "\n**", $text ); // \\** -> \n** 237 $text = preg_replace( '/\\\\+\\*/', "\n*", $text ); // \* -> \n* 238 239 // 3) Single '*' (die nicht Teil von '**' sind) ebenfalls als Listenstarter normalisieren: ersetzt jedes einzelne '*' (nicht Teil eines '**') durch "\n*" 240 $text = preg_replace( '/(?<!\*)\*(?!\*)/', "\n*", $text ); 241 242 // 4) Überschriften **...** -> Platzhalter (sicher vor weiterer Verarbeitung) 243 $text = preg_replace( '/\*\*(.+?)\*\*/s', "\n%%H3%%$1\n", $text ); 244 245 // 5) Optional: entferne verbleibende Backslashes (die keine Sternchen markiert haben) (wir haben die für Sternchen-bezogenen Fälle bereits behandelt) 246 $text = str_replace( '\\', '', $text ); 247 248 // 6) Mehrfache newlines zusammenfassen 249 $text = preg_replace( "/\n+/", "\n", $text ); 250 $text = trim( $text, "\n" ); 251 252 $lines = explode( "\n", $text ); 253 $html = ''; 234 // ------------------------- 235 // 1) H3 zuerst sichern 236 // ------------------------- 237 $text = preg_replace_callback( 238 '/\*\*(.*?)\*\*/s', 239 function( $m ) { 240 return "\n%%H3%%" . trim( $m[1] ) . "\n"; 241 }, 242 $text 243 ); 244 245 // ------------------------- 246 // 2) Listenmarker normalisieren 247 // ------------------------- 248 $text = preg_replace('/\\\\+-/', "\n- ", $text); 249 $text = preg_replace('/\\\\+\\*/', "\n* ", $text); 250 $text = preg_replace('/(?<=\S)\s-\s/', "\n- ", $text); 251 252 // ------------------------- 253 // 3) KRITISCHE LOGIK: 254 // Wenn Backslashes nach Satzende kommen → Absatz 255 // ------------------------- 256 $text = preg_replace('/([.!?])\\\\{2,}/', "$1\n", $text); 257 258 // ------------------------- 259 // 4) Restliche Mehrfach-Backslashes → <br> 260 // ------------------------- 261 $text = preg_replace('/\\\\{2,}/', '%%BR%%', $text); 262 263 // Restliche Backslashes entfernen 264 $text = str_replace('\\', '', $text); 265 266 // Aufräumen 267 $text = preg_replace("/\n+/", "\n", $text); 268 $text = trim($text); 269 270 $lines = explode("\n", $text); 271 272 $html = ''; 254 273 $in_list = false; 255 $started = false; // merken: noch kein Hauptblock ausgegeben?256 274 257 275 foreach ( $lines as $line ) { 258 $line = trim( $line ); 259 if ( $line === '' ) 260 continue; 261 262 // H3 placeholder? 263 if ( strpos( $line, '%%H3%%' ) === 0 ) { 264 if ( $in_list ) { 265 $html .= "</ul>\n"; 276 277 $line = trim($line); 278 if ($line === '') continue; 279 280 // -------- H3 -------- 281 if (strpos($line, '%%H3%%') === 0) { 282 283 if ($in_list) { 284 $html .= "</ul>\n"; 266 285 $in_list = false; 267 286 } 268 $title = trim( substr( $line, 6 ) ); 269 $html .= '<h3>' . esc_html( $title ) . "</h3>\n"; 270 $started = true; 287 288 $title = trim(substr($line, 6)); 289 $title = str_replace('%%BR%%', '<br>', esc_html($title)); 290 291 $html .= "<h3>{$title}</h3>\n"; 271 292 continue; 272 293 } 273 294 274 // First <p> 275 if ( !$started ) { 276 // If line begins with '*' remove it for <p> 277 $candidate = $line; 278 if ( isset( $candidate[0] ) && $candidate[0] === '*' ) 279 $candidate = ltrim( $candidate, "* \t" ); 280 281 if ( $candidate !== '' ) { 282 $html .= '<p>' . esc_html( $candidate ) . "</p>\n"; 283 $started = true; 295 // -------- LISTE -------- 296 if (preg_match('/^[-*]\s*(.+)$/', $line, $m)) { 297 298 if (!$in_list) { 299 $html .= "<ul>\n"; 300 $in_list = true; 284 301 } 302 303 $item = str_replace('%%BR%%', '<br>', esc_html(trim($m[1]))); 304 $html .= "<li>{$item}</li>\n"; 285 305 continue; 286 306 } 287 307 288 if ( isset( $line[0] ) && $line[0] === '*' ) { 289 $items = array_filter( array_map( 'trim', explode( '*', $line ) ) ); 290 if ( ! empty( $items ) ) { 291 if ( ! $in_list ) { 292 $html .= "<ul>\n"; 293 $in_list = true; 294 } 295 foreach ( $items as $item ) { 296 if ( $item === '' ) continue; 297 $html .= '<li>'.esc_html( $item )."</li>\n"; 298 } 299 continue; 300 } 301 } 302 303 if ( $in_list ) { 304 $html .= "</ul>\n"; 308 // -------- NORMALER ABSATZ -------- 309 if ($in_list) { 310 $html .= "</ul>\n"; 305 311 $in_list = false; 306 312 } 307 313 308 $html .= '<p>'.esc_html( $line )."</p>\n"; 314 $content = str_replace('%%BR%%', '<br>', esc_html($line)); 315 $html .= "<p>{$content}</p>\n"; 309 316 } 310 317 311 if ( $in_list)318 if ($in_list) 312 319 $html .= "</ul>\n"; 313 320 … … 420 427 ); 421 428 422 $return = array_key_exists( $data, $data_descriptions ) ? $data_descriptions[$data] : ''; 423 424 return $return; 429 if ( array_key_exists( $data, $data_descriptions ) ) 430 return $data_descriptions[$data]; 431 432 return $data; 425 433 } 426 434 427 435 function mobile_api_translate_data_value( $value ) { 428 // Documentat ation: https://services.mobile.de/docs/search-api.html436 // Documentation: https://services.mobile.de/docs/search-api.html 429 437 430 438 $data_values = array( -
ad-integration-for-mobile-de-api/trunk/mobile-api.php
r3460286 r3464464 13 13 * Description: Plugin to integrate the Ad-Integration for mobile.de via the API and show your vehicles on your website. 14 14 * Network: true 15 * Version: 1. 015 * Version: 1.2 16 16 * License: GPLv2 or later 17 17 * License URI: https://www.gnu.org/licenses/gpl-2.0.html 18 18 * Requires at least: 6.7 19 * Requires PHP: 7.019 * Requires PHP: 8.0 20 20 * Author: ComMotion 21 21 * Author URI: https://commotion.online/ … … 167 167 public function single_vehicle_template( $single ) { 168 168 if ( /* ( !function_exists( 'wp_is_block_theme' ) || !wp_is_block_theme() ) && */ is_singular( 'mobile-api-vehicle' ) ) { 169 $theme_templates = array( 170 'single-ad-integration-for-mobile-de-api-vehicle.php', // Default WP naming 171 'ad-integration-for-mobile-de-api-single-vehicle.php', // Alternate WP naming 172 'ad-integration-for-mobile-de-api/single-vehicle.php' // optional structural override 173 ); 174 $theme_template = locate_template( $theme_templates ); 175 if ( !empty( $theme_template ) ) 176 return $theme_template; 177 169 178 $plugin_template = plugin_dir_path( __FILE__ ).'templates/single-vehicle.php'; 170 171 179 if ( file_exists( $plugin_template ) ) 172 180 return $plugin_template; -
ad-integration-for-mobile-de-api/trunk/readme.txt
r3460286 r3464464 4 4 Requires at least: 6.7 5 5 Tested up to: 6.9 6 Requires PHP: 7.07 Stable tag: 1. 16 Requires PHP: 8.0 7 Stable tag: 1.2 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 137 137 == Changelog == 138 138 139 = 1.2 = 140 * Compatibility for custom template overrides. 141 * Better detection of line breaks in the vehicle description. 142 * Fixes a bug if a data value does not exist. 143 139 144 = 1.1 = 140 145 * Post image updates on change. 141 *142 146 * Minor bugfixes and improvements. 143 147 * Compatibility for latest WordPress version.
Note: See TracChangeset
for help on using the changeset viewer.