funktioniert Custom Post Type und Widget Code funktioniert nicht mehr, wenn Sie von functions.php nach plugin verschoben werden

Ich habe einige functionen für eine Unternehmens-Website rund um Stellenanzeigen entwickelt. Es gibt einen benutzerdefinierten Post-Typ mit speziellen Feldern und ein Widget, das eine Zusammenfassung der aktuellen Job-Postings anzeigt. Es sind 5 functionen und eine Widget-class, die von verschiedenen Websites zusammengehumpelt und in functions.php ausgelagert wurde. Es klappt.

Jetzt möchte ich es zu einem Plugin extrahieren, aber mein Verständnis ist schwach … Mein erster Versuch war, es einfach in eine PHP-Datei mit einem Header zu speichern, aber das warf eine Reihe von Fehlern, als ich versuchte, es zu aktivieren. Dann lege ich alle functionshaken in den Aktivierungs-Hook für das Plugin – was keine Fehler verursacht, aber auch nichts zu tun scheint.

 array( 'name' => __('Careers'), 'singular_name' => __('Careers'), 'all_items' => __('All Job Postings'), 'add_new_item' => __('Add New Job Posting'), 'edit_item' => __('Edit Job Posting'), 'view_item' => __('View Job Posting') ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'careers'), 'show_ui' => true, 'show_in_menu' => true, 'show_in_nav_menus' => true, 'show_in_admin_bar' => true, 'capability_type' => 'post', 'supports' => array('title', 'editor', 'thumbnail'), 'exclude_from_search' => true, 'menu_position' => 6, 'has_archive' => true, 'menu_icon' => 'dashicons-universal-access' ); register_post_type('careers', $args); } function add_careers_to_admin_bar($wp_admin_bar){ $wp_admin_bar->add_node( array( 'title' => 'Careers' ) ); $wp_admin_bar->add_node( array( 'parent' => 'careers', 'title' => 'All Job Postings', 'href' => get_admin_url().'edit.php?post_type=careers' ) ); $wp_admin_bar->add_node( array( 'parent' => 'careers', 'title' => 'New Job Posting', 'href' => get_admin_url().'post-new.php?post_type=careers' ) ); } function add_careers_meta_box(){ add_meta_box( 'job-details', 'Job Details', 'careers_meta_box_cb', 'Careers', 'normal', 'default'); } function careers_meta_box_cb($post){ $Post_ID = get_post_custom( $post->ID ); $salary = isset( $Post_ID['salary'] ) ? esc_attr( $Post_ID['salary'][0] ) : ""; $salary_unit = isset( $Post_ID['salary_unit'] ) ? esc_attr( $Post_ID['salary_unit'][0] ) : "hr"; $qualifications = isset( $Post_ID['qualifications'] ) ? esc_attr( $Post_ID['qualifications'][0] ) : ""; //echo $qualifications; $desirables = isset( $Post_ID['desirables'] ) ? esc_attr( $Post_ID['desirables'][0] ) : ""; //echo $desirables; wp_nonce_field( 'job_details_nonce_action', 'job_details_nonce' ); $html = ''; $html .= ''; $html .= ''; $html .= ''; $html .= '
'; $html .= 'hrdaymonthannum'; $html .= '
'; $html .= '
'; $html .= '
'; $html .= '
'; echo $html; } function save_careers_meta_box($post_id){ // Bail if we're doing an auto save if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; // if our nonce isn't there, or we can't verify it, bail if( !isset( $_POST['job_details_nonce'] ) || !wp_verify_nonce( $_POST['job_details_nonce'], 'job_details_nonce_action' ) ) return; // if our current user can't edit this post, bail if( !current_user_can( 'edit_post' ) ) return; if(isset( $_POST['salary'] ) ) update_post_meta( $post_id, 'salary', $_POST['salary']); if(isset( $_POST['salary_unit'] ) ) update_post_meta( $post_id, 'salary_unit', $_POST['salary_unit']); if(isset( $_POST['qualifications'] ) ) update_post_meta( $post_id, 'qualifications', $_POST['qualifications']); if(isset( $_POST['desirables'] ) ) update_post_meta( $post_id, 'desirables', $_POST['desirables']); } class CurrentJobs_Widget extends WP_Widget{ function __construct() { parent::__construct( 'currentjobs_widget', // Base ID 'Current Jobs Widget', // Name array('description' => __( 'Displays your latest listings. Outputs the title and expiry per listing')) ); } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['title'] = strip_tags($new_instance['title']); $instance['numberOfListings'] = strip_tags($new_instance['numberOfListings']); return $instance; } function form($instance) { if( $instance) { $title = esc_attr($instance['title']); $numberOfListings = esc_attr($instance['numberOfListings']); } else { $title = ''; $numberOfListings = ''; } ?>

<label for="get_field_id('title'); ?>"> <input class="widefat" id="get_field_id('title'); ?>" name="get_field_name('title'); ?>" type="text" value="" />

<label for="get_field_id('numberOfListings'); ?>"> <select id="get_field_id('numberOfListings'); ?>" name="get_field_name('numberOfListings'); ?>"> <?php for($x=1;$x <option value="">

getJobListings($numberOfListings); echo $after_widget; } function getJobListings($numberOfListings) { //html global $post; $listings = new WP_Query(); $listings->query('post_type=careers&posts_per_page=' . $numberOfListings ); if($listings->found_posts > 0) { echo '
    '; while ($listings->have_posts()) { $listings->the_post(); $listItem = '
  • ' . $image; $listItem .= ''; $listItem .= get_the_title() . '
    '; $listItem .= 'Added ' . get_the_date() . '
  • '; echo $listItem; } echo '
'; wp_reset_postdata(); }else{ echo '

No postings found

'; } } } //end class CurrentJobs_Widget

Vorschläge für weitere Lektüre sind großartig.

Solutions Collecting From Web of "funktioniert Custom Post Type und Widget Code funktioniert nicht mehr, wenn Sie von functions.php nach plugin verschoben werden"

Wenn alles, was Sie wollen, ist für Ihr Plugin einfach funktionieren

ersetzen

 register_activation_hook( __FILE__, 'activate_my_careers' ); 

mit

 add_action( 'plugins_loaded', 'activate_my_careers' ); 

Wenn Sie verstehen möchten, warum Ihr neues Plugin nicht funktioniert, müssen Sie WordPress-Hooks verstehen. Ich möchte Sie ermutigen, die WordPress Plugin API sorgfältig zu lesen.

Der erste verfügbare Hook für (nicht zu verwendende) Plugins ist plugins_loaded . Wenn ich Plugins schreibe, ist das Einzige, was ich in die Haupt-Plugin-Datei lege, das Hinzufügen von Aktionen zu den Aktivierungs-, Deaktivierungs- und plugins_loaded Hooks.

Die vom plugins_loaded-Hook aufgerufene function / Methode sollte Ihr Plugin laden, indem Sie anderen Hooks Aktionen und Filter hinzufügen. Durch die Verwendung von Haken erlauben Sie sich und anderen Plugins die Möglichkeit, diese Haken vor dem Abfeuern zu entfernen. Dies macht Ihr Plugin erweiterbar.

Der Schlüssel besteht darin, zu wissen, welche Hooks ausgetriggers werden und welche functionen / Methoden zu bestimmten Hooks hinzugefügt werden, die nur ausgetriggers werden, wenn die function / Methode verfügbar sein soll.

In diesem Beispiel ist die einzige Aktion, die wir hinzufügen möchten, wenn die Haupt-Plugin-Datei enthalten ist, ein Hook für plugins_loaded. Der Callback für diesen Hook fügt dann die anderen Aktionen hinzu, die für das functionieren Ihres Plugins benötigt werden.

Der Grund dafür, dass Ihr Plugin nicht funktioniert, liegt darin, dass der Aktivierungs-Hook nur ausgetriggers wird, sobald ein Plugin aktiviert wird. Sobald das Plugin aktiviert ist, wird der einzige andere aufgerufene Hook heruntergefahren, bevor Sie auf eine andere Seite weitergeleitet werden. Von diesem Zeitpunkt an wird der Aktivierungshaken nicht mehr ausgetriggers und da keine anderen Aktionen ausgeführt werden, wird auch dieser ausgetriggers.

hole keine actions und register_widget in die function activate_my_careers aber wenn du dies tust, hake diese function auch mit einem der Hooks. wie init , admin_init

 add_action( 'init', 'activate_my_careers' ); 

oder benutzen Sie den Plugin-Aktivierungs-Haken. mögen

 register_activation_hook( __FILE__, 'activate_my_careers' ); 

beispielsweise

 function activate_my_careers() { add_action( 'init', 'create_career_posttype'); add_action( 'admin_bar_menu', 'add_careers_to_admin_bar', 1000000); add_action( 'add_meta_boxes', 'add_careers_meta_box' ); add_action( 'save_post', 'save_careers_meta_box' ); register_widget('CurrentJobs_Widget'); } 

Sie können verwenden:

 function activate_my_careers() { add_action( 'init', 'create_career_posttype'); add_action( 'admin_bar_menu', 'add_careers_to_admin_bar', 1000000); add_action( 'add_meta_boxes', 'add_careers_meta_box' ); add_action( 'save_post', 'save_careers_meta_box' ); register_widget('CurrentJobs_Widget'); } } register_activation_hook( __FILE__, 'activate_my_careers' ); 

Wo sind Ihre anderen functionen definiert?

Sie müssen auch alle Ihre callbacke (create_career_posttype, add_careers_to_admin_bar, etc) angeben oder einschließen …

 function create_career_posttype() { //code } function add_careers_to_admin_bar() { //code } function add_careers_meta_box() { //code } function save_careers_meta_box() { //code } register_activation_hook( __FILE__, 'activate_my_careers' ); //