ID, '_projects_portfolio_is_website', true ); $provider = get_post_meta( $post->ID, '_projects_portfolio_provider', true ); if ( '' === $provider ) { $provider = 'github'; } $repo_url = get_post_meta( $post->ID, '_projects_portfolio_repo_url', true ); if ( '' === $repo_url ) { $repo_url = get_post_meta( $post->ID, '_projects_portfolio_github_url', true ); } $gitea_base_url = get_post_meta( $post->ID, '_projects_portfolio_gitea_base_url', true ); $site_url = get_post_meta( $post->ID, '_projects_portfolio_site_url', true ); $site_platform = get_post_meta( $post->ID, '_projects_portfolio_site_platform', true ); $site_screenshot = (int) get_post_meta( $post->ID, '_projects_portfolio_site_screenshot_id', true ); ?>

>

>

post_type ) { return; } wp_enqueue_media(); } add_action( 'admin_enqueue_scripts', 'projects_portfolio_enqueue_media_for_meta_box' ); /** * Save the Repository meta box. * * Performs a lazy migration from legacy `_projects_portfolio_github_url`. * * @param int $post_id * * @since 1.0.0 * @return void */ function projects_portfolio_save_meta_box( $post_id ) { if ( ! isset( $_POST['projects_portfolio_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['projects_portfolio_meta_box_nonce'], 'projects_portfolio_save_meta_box' ) ) { return; } if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } $existing_provider = get_post_meta( $post_id, '_projects_portfolio_provider', true ); $existing_repo_url = get_post_meta( $post_id, '_projects_portfolio_repo_url', true ); $legacy_github = get_post_meta( $post_id, '_projects_portfolio_github_url', true ); // Lazy migration: legacy URL present, no explicit choice. if ( '' === $existing_provider && '' === $existing_repo_url && '' !== $legacy_github ) { update_post_meta( $post_id, '_projects_portfolio_provider', 'github' ); update_post_meta( $post_id, '_projects_portfolio_repo_url', $legacy_github ); } // "This project is a website" toggle — drives which set of fields is kept. $is_website = isset( $_POST['projects_portfolio_is_website'] ) && '1' === $_POST['projects_portfolio_is_website']; if ( $is_website ) { update_post_meta( $post_id, '_projects_portfolio_is_website', '1' ); } else { delete_post_meta( $post_id, '_projects_portfolio_is_website' ); } if ( isset( $_POST['projects_portfolio_provider'] ) ) { $provider = ( 'gitea' === $_POST['projects_portfolio_provider'] ) ? 'gitea' : 'github'; update_post_meta( $post_id, '_projects_portfolio_provider', $provider ); } if ( isset( $_POST['projects_portfolio_repo_url'] ) ) { $repo_url = esc_url_raw( wp_unslash( $_POST['projects_portfolio_repo_url'] ) ); update_post_meta( $post_id, '_projects_portfolio_repo_url', $repo_url ); // Maintain the legacy key for backward-compat reads (only when this is a GitHub project). $provider_now = get_post_meta( $post_id, '_projects_portfolio_provider', true ); if ( 'github' === $provider_now ) { if ( '' === $repo_url ) { // Clearing the field on a GitHub project should clear the legacy key too. delete_post_meta( $post_id, '_projects_portfolio_github_url' ); } else { update_post_meta( $post_id, '_projects_portfolio_github_url', $repo_url ); } } else { // Provider is gitea (or any non-github): ensure no stale GitHub URL can // resurrect via the legacy fallback chain. delete_post_meta( $post_id, '_projects_portfolio_github_url' ); } } if ( isset( $_POST['projects_portfolio_gitea_base_url'] ) ) { update_post_meta( $post_id, '_projects_portfolio_gitea_base_url', esc_url_raw( wp_unslash( $_POST['projects_portfolio_gitea_base_url'] ) ) ); } // Website fields. if ( isset( $_POST['projects_portfolio_site_url'] ) ) { $site_url = esc_url_raw( wp_unslash( $_POST['projects_portfolio_site_url'] ) ); if ( '' === $site_url ) { delete_post_meta( $post_id, '_projects_portfolio_site_url' ); } else { update_post_meta( $post_id, '_projects_portfolio_site_url', $site_url ); } } if ( isset( $_POST['projects_portfolio_site_platform'] ) ) { $platform = sanitize_text_field( wp_unslash( $_POST['projects_portfolio_site_platform'] ) ); if ( '' === $platform ) { delete_post_meta( $post_id, '_projects_portfolio_site_platform' ); } else { update_post_meta( $post_id, '_projects_portfolio_site_platform', $platform ); } } if ( isset( $_POST['projects_portfolio_site_screenshot_id'] ) ) { $screenshot_id = absint( wp_unslash( $_POST['projects_portfolio_site_screenshot_id'] ) ); if ( $screenshot_id <= 0 ) { delete_post_meta( $post_id, '_projects_portfolio_site_screenshot_id' ); } else { update_post_meta( $post_id, '_projects_portfolio_site_screenshot_id', $screenshot_id ); } } // When modes switch, clear the opposite mode's fields so the project is cleanly one or the other. if ( $is_website ) { delete_post_meta( $post_id, '_projects_portfolio_provider' ); delete_post_meta( $post_id, '_projects_portfolio_repo_url' ); delete_post_meta( $post_id, '_projects_portfolio_gitea_base_url' ); delete_post_meta( $post_id, '_projects_portfolio_github_url' ); } else { delete_post_meta( $post_id, '_projects_portfolio_site_url' ); delete_post_meta( $post_id, '_projects_portfolio_site_platform' ); delete_post_meta( $post_id, '_projects_portfolio_site_screenshot_id' ); } } add_action( 'save_post', 'projects_portfolio_save_meta_box' );