delete( $id ); self::redirect( 'deleted' ); } /** * Gibt die Seite aus. * * @return void */ public static function render(): void { if ( ! current_user_can( Plugin::CAPABILITY ) ) { wp_die( esc_html__( 'You are not allowed to do this.', 'aivor-content-import' ) ); } self::render_notice(); // phpcs:ignore WordPress.Security.NonceVerification.Recommended $action = isset( $_GET['action'] ) ? sanitize_key( wp_unslash( $_GET['action'] ) ) : ''; if ( 'edit' === $action || 'new' === $action ) { self::render_form( $action ); return; } self::render_list(); } /** * Klartext-Beschreibung des Ziels eines Jobs. * * @param Job $job Der Job. * @return string */ public static function describe_target( Job $job ): string { $post_type = get_post_type_object( $job->post_type ); $label = $post_type instanceof \WP_Post_Type ? $post_type->labels->singular_name : $job->post_type; if ( '' === $job->taxonomy || 0 === $job->term_id ) { return $label; } $term = get_term( $job->term_id, $job->taxonomy ); if ( ! $term instanceof \WP_Term ) { return $label . ' — ' . __( '(term no longer exists)', 'aivor-content-import' ); } return $label . ' — ' . $term->name; } /** * Klartext-Beschreibung des Autors eines Jobs. * * @param Job $job Der Job. * @return string */ public static function describe_author( Job $job ): string { if ( 0 === $job->author_id ) { return __( 'Default author', 'aivor-content-import' ); } $user = get_userdata( $job->author_id ); return $user instanceof \WP_User ? $user->display_name : __( '(user deleted)', 'aivor-content-import' ); } /** * Klartext, was nach dem Import mit einem Beitrag passiert. * * @param Job $job Der Job. * @return string */ public static function describe_mode( Job $job ): string { if ( Job::MODE_PENDING === $job->mode ) { return __( 'Submitted for review', 'aivor-content-import' ); } return __( 'Saved as draft', 'aivor-content-import' ); } /** * Nimmt das Formular entgegen. * * @return void */ private static function save(): void { check_admin_referer( self::NONCE_ACTION ); $repository = new JobRepository(); // Das Feld heisst aivor_post_type, nicht post_type: admin.php liest // $_REQUEST['post_type'], sucht die Seite dann unter admin.php?post_type=…, // findet sie nicht und bricht mit „Cannot load" ab. $id = isset( $_POST['job_id'] ) ? absint( wp_unslash( $_POST['job_id'] ) ) : 0; $aivor_job_id = isset( $_POST['aivor_job_id'] ) ? strtolower( trim( sanitize_text_field( wp_unslash( $_POST['aivor_job_id'] ) ) ) ) : ''; $post_type = isset( $_POST['aivor_post_type'] ) ? sanitize_key( wp_unslash( $_POST['aivor_post_type'] ) ) : 'post'; $author_id = isset( $_POST['author_id'] ) ? absint( wp_unslash( $_POST['author_id'] ) ) : 0; $mode = isset( $_POST['mode'] ) ? sanitize_key( wp_unslash( $_POST['mode'] ) ) : Job::MODE_DRAFT; $comments = ! empty( $_POST['enable_comments'] ); $term_field = isset( $_POST['term'] ) ? sanitize_text_field( wp_unslash( $_POST['term'] ) ) : ''; if ( ! self::is_uuid( $aivor_job_id ) ) { self::redirect( 'invalid_uuid', $id, true ); } if ( ! in_array( $post_type, self::selectable_post_types(), true ) ) { self::redirect( 'invalid_post_type', $id, true ); } $taxonomy = ''; $term_id = 0; if ( '' !== $term_field ) { $parts = explode( ':', $term_field, 2 ); if ( 2 === count( $parts ) ) { $taxonomy = sanitize_key( $parts[0] ); $term_id = absint( $parts[1] ); } if ( '' === $taxonomy || 0 === $term_id || ! in_array( $taxonomy, get_object_taxonomies( $post_type ), true ) ) { self::redirect( 'invalid_term', $id, true ); } if ( ! get_term( $term_id, $taxonomy ) instanceof \WP_Term ) { self::redirect( 'invalid_term', $id, true ); } } if ( ! in_array( $mode, Job::modes(), true ) ) { $mode = Job::MODE_DRAFT; } $existing = $id > 0 ? $repository->find( $id ) : null; $base = $existing instanceof Job ? $existing : new Job(); // Eine geaenderte Import-Job-ID gehoert womoeglich zu einer anderen // Site; die zwischengespeicherten Angaben des alten Jobs gelten nicht mehr. $same_remote = $base->aivor_job_id === $aivor_job_id; $job = $base->with( array( 'aivor_job_id' => $aivor_job_id, 'post_type' => $post_type, 'taxonomy' => $taxonomy, 'term_id' => $term_id, 'author_id' => $author_id, 'mode' => $mode, 'enable_comments' => $comments, 'site_hash' => $same_remote ? $base->site_hash : '', 'remote_name' => $same_remote ? $base->remote_name : '', 'remote_site_url' => $same_remote ? $base->remote_site_url : '', 'remote_status' => $same_remote ? $base->remote_status : '', 'error' => $same_remote ? $base->error : '', ) ); $job = $repository->save( $job ); // Bei einer Aktivierung ohne angemeldeten Benutzer (WP-CLI, Installer) // fehlt der Standard-Autor noch; spaetestens hier ist jemand da. Settings::adopt_default_author( get_current_user_id() ); if ( '' === Settings::api_key() ) { self::redirect( 'saved' ); } $notices = array( 'ok' => 'saved_verified', 'not_found' => 'saved_not_found', 'forbidden' => 'saved_forbidden', ); self::redirect( $notices[ ConnectionCheck::check_job( $job ) ] ?? 'saved_unverified' ); } /** * Gibt die Liste aus. * * @return void */ private static function render_list(): void { $table = new JobsListTable(); $table->prepare_items(); $new_url = add_query_arg( array( 'page' => self::SLUG, 'action' => 'new', ), admin_url( 'admin.php' ) ); ?>
find( $id ) : null; if ( 'edit' === $action && ! $job instanceof Job ) { echo '%s
error ); ?>
%s