Wie erstelle ich benutzerdefinierte Felder für einen CPT aus zwischengespeicherten XML-Daten beim Speichern / Aktualisieren von Posts?

Ich bekomme XML-Daten über einen FTP-Feed zu meinem Webserver, der Informationen über Cricket-Matches eines Teams enthält – (EDC.Fixtures.datetimestring.xml)

         .... and so on and so on 

Ich habe ein schnelles Plugin geschrieben, um die ‘Fixtures’ in diesem Feed mit einem WordPress CPT zu verbinden und die Feed-ID ‘41424’ als ein benutzerdefiniertes Meta-Feld zu speichern, so dass ich auf die anderen CML-Feeds für dieses Spiel verweisen kann. Aus Gründen der Zweckmäßigkeit nennen wir es Match_ID.xml

  /* Adds a box to the main column on the Post and Page edit screens */ function wccc_feed_add_custom_box() { global $pagenow; $meta_box_title = ($pagenow == 'post-new.php' && is_admin()) ? 'Choose Record from Feed' : 'You are editing'; $screens = array('matches'); foreach ($screens as $screen) { add_meta_box( 'wccc_record_sectionid', __($meta_box_title, 'wccc_textdomain' ), 'wcccc_record_inner_custom_box', $screen, 'advanced', 'high' ); } } /* Prints the box content */ function wcccc_record_inner_custom_box( $post ) { global $pagenow; if($pagenow == 'post-new.php'){ // Use nonce for verification wp_nonce_field( plugin_basename( __FILE__ ), 'wccc_noncename' ); $fixture_files = preg_grep('~^EDC.fixtures.*\.(xml)$~', scandir(FEED_DIR, SCANDIR_SORT_ASCENDING)); //array_pop(array_reverse($fixture_files)); $fixture_file = array_pop(array_reverse($fixture_files)); if (file_exists(FEED_DIR .'/'. $fixture_file)): $xml = simplexml_load_file(FEED_DIR .'/'. $fixture_file); $json = json_encode($xml); $array = json_decode($json,TRUE); $fixtures = $array['fixture']; endif; // echo "
"; // print_r($fixtures); // echo "

"; $matches_in_wordpress = get_posts(array('post_type'=>'matches','posts_per_page'=>-1)); // Create an array of IDs of shows in WP. // (We use this to ensure we don't ask the user to choose a match in the feed that has already been added to WP) $wp_matches = array(); foreach($matches_in_wordpress as $miw){ $wp_matches[] = get_post_meta($miw->ID,'_wcc_feed_id',true); } echo ' '; echo ''; foreach ($fixtures as $fixture): $match_id = $fixture['@attributes']['id']; $comp_name = $fixture['@attributes']['comp_name']; $match_game_date = $fixture['@attributes']['game_date']; $match_game_date_string = $fixture['@attributes']['game_date_string']; $match_game_date_time = $fixture['@attributes']['game_date_time']; $match_away_team = $fixture['@attributes']['away_team']; $match_home_team = $fixture['@attributes']['home_team']; $match_away_team_name = $fixture['@attributes']['away_team_name']; $match_home_team_name = $fixture['@attributes']['home_team_name']; if ($match_away_team == '56' || $match_home_team == '56' ) { if(!in_array($match_id,$wp_matches)){ echo '' . $match_home_team_name .' vs '. $match_away_team_name .' ('.$match_game_date_string.')'; } } endforeach; echo ''; echo '

'; echo '

'; } else { if(get_post_meta($post->ID,'_wcc_feed_id',true)){ echo '

'.$post->post_title . ' // Feed ID: ' . get_post_meta($post->ID,'_wcc_feed_id',true) . '

'; } else { echo '

'.$post->post_title . ' // No Feed ID

'; } } } /* When the post is saved, saves our custom data */ function wccc_save_postdata($post_id) { if ( ! current_user_can( 'edit_post', $post_id ) ) return; // Secondly we need to check if the user intended to change this value. if ( ! isset( $_POST['wccc_noncename'] ) || ! wp_verify_nonce( $_POST['wccc_noncename'], plugin_basename( __FILE__ ) ) ) return; //if saving in a custom table, get post_ID $post_ID = $_POST['post_ID']; //sanitize user input if($_POST['not_opta'] == "1"){ $override_title = sanitize_text_field($_POST['opta_override']); //remove action to prevent infinite loop remove_action('save_post','wccc_save_postdata'); wp_update_post(array('ID'=>$post_ID,'post_title'=>$override_title,'post_name'=>str_replace(' ','-',$override_title))); add_action('save_post','wccc_save_postdata'); } else { $wccc_feed_data = sanitize_text_field($_POST['wccc_feed_data']); $wccc_feed_data = explode('|',$wccc_feed_data); //remove action to prevent infinite loop remove_action('save_post','wccc_save_postdata'); wp_update_post(array('ID'=>$post_ID,'post_title'=>$wccc_feed_data[1],'post_name'=>str_replace(' ','-',$wccc_feed_data[1]))); add_action('save_post','wccc_save_postdata'); add_post_meta($post_ID, '_wcc_feed_id', $wccc_feed_data[0], true) or update_post_meta($post_ID, '_wcc_feed_id', $wccc_feed_data[0]); } } # Now move advanced meta boxes after the title: function foo_move_deck() { # Get the globals: global $post, $wp_meta_boxes; # Output the "advanced" meta boxes: do_meta_boxes(get_current_screen(), 'advanced', $post); # Remove the initial "advanced" meta boxes: unset($wp_meta_boxes['matches']['advanced']); } add_action('edit_form_after_title', 'foo_move_deck'); /* Hide the title on edit only http://wordpress.stackexchange.com/questions/110427/remove-post-title-input-from-edit-page http://wordpress.stackexchange.com/questions/97241/how-do-i-only-load-js-on-the-post-new-php-and-post-php-pages-in-admin */ add_action('admin_init', 'wpse_110427_hide_title'); function wpse_110427_hide_title($post) { global $pagenow; if (!empty($pagenow) && ('post-new.php' === $pagenow)){ remove_post_type_support('matches', 'title'); } if(isset($_GET['post'])) { if(get_post_meta($_GET['post'],'_wcc_feed_id',true)){ remove_post_type_support('matches', 'editor'); } } }

Wenn Sie den Post-Typ besuchen und die Feed-Informationen aus der match_ID.xml einholen, falls diese vorhanden sind – andernfalls wird eine Benachrichtigung angezeigt, die später zurückgegeben wird, wenn sie vorhanden ist.

Das Problem, das ich habe, ist die Archivseite oder “Fixtures-Seite” – ich muss eine Liste der kommenden Matches anzeigen – dies wurde getan, indem ich durch die EDC.Fixtures.datetimestring.xml Datei schaue und die Daten zeige – dann suche die CPT, die mit der Feed-ID verknüpft ist und den Permalink ergreift.

Allerdings – ich muss NON xml basierte Match Matches hinzufügen (zweites XI Team, zufällige Freundschaftsspiele, Euro Spiele usw.) – ich kann diese als CPT hinzufügen und den XML Link überspringen, aber diese Information befindet sich nicht im selben Array wie die XML Daten .

Ich habe versucht, eine benutzerdefinierte Post-Typ-Abfrage auszuführen, aber keine der Informationen aus dem Feed – außer der ID.

Was id gerne tut, ist diese Informationsinformation als benutzerdefinierte Felder im CPT zu speichern, damit ich sie in der LOOP-Datei referenzieren kann, anstatt die Daten aus EDC.Fixtures.datetimestring.xml zu verwenden, um die Fixtures aufzulisten.

   

Vielen Dank im Voraus für Ihre Hilfe.

Solutions Collecting From Web of "Wie erstelle ich benutzerdefinierte Felder für einen CPT aus zwischengespeicherten XML-Daten beim Speichern / Aktualisieren von Posts?"