Release / Build & publish plugin zip (push) Successful in 7s
Lucide (https://lucide.dev) replaces the hand-rolled Tabler paths. Lucide is more compact and consistent, and ships under the ISC license (more permissive than Tabler's MIT and equally fine for plugin redistribution). Lucide has no brand icons for Reddit/WhatsApp/Pinterest, so we use generic substitutes that preserve the visual intent: - reddit.svg <- lucide 'share-2' (community share metaphor) - whatsapp.svg <- lucide 'message-circle' - pinterest.svg<- lucide 'pin' Avatar: shrunk to 40x40 per user testing — sizes above 41x41 were being clipped inside the round border on this host.
190 lines
9.0 KiB
PHP
190 lines
9.0 KiB
PHP
<?php
|
|
// Check if the theme is an FSE (block theme)
|
|
$is_fse_theme = wp_theme_has_theme_json() && function_exists( 'wp_is_block_theme' ) && wp_is_block_theme();
|
|
|
|
if ( $is_fse_theme ) {
|
|
wp_head();
|
|
echo do_blocks( '<!-- wp:template-part {"slug":"header"} /-->' ); // phpcs:ignore
|
|
} else {
|
|
get_header();
|
|
}
|
|
|
|
$settings = projects_portfolio_settings();
|
|
$project_id = get_the_ID();
|
|
$download_count = (int) get_post_meta( $project_id, '_projects_portfolio_download_count', true );
|
|
|
|
$repo_url = get_post_meta( $project_id, '_projects_portfolio_repo_url', true );
|
|
if ( '' === $repo_url ) {
|
|
$repo_url = get_post_meta( $project_id, '_projects_portfolio_github_url', true );
|
|
}
|
|
|
|
$repo_data = projects_portfolio_get_repo_data( $project_id );
|
|
$version = projects_portfolio_get_version( $project_id );
|
|
$owner = projects_portfolio_get_owner( $project_id );
|
|
|
|
$owner_avatar = $repo_data['owner']['avatar_url'] ?? '';
|
|
$owner_name = $repo_data['owner']['login'] ?? '';
|
|
$owner_url = $repo_data['owner']['html_url'] ?? '';
|
|
$last_updated = $repo_data['updated_at'] ?? '';
|
|
$language = $repo_data['language'] ?? '';
|
|
$license = $repo_data['license']['name'] ?? 'None';
|
|
$browse_url = $repo_url ? projects_portfolio_get_repo_browse_url( $project_id ) : '';
|
|
|
|
if ( $last_updated ) {
|
|
$last_updated = date_i18n( get_option( 'date_format' ), strtotime( $last_updated ) );
|
|
}
|
|
?>
|
|
|
|
<body <?php body_class(); ?>>
|
|
|
|
<div class="project-single-container">
|
|
<div class="project-header">
|
|
<div class="project-banner">
|
|
<?php if ( has_post_thumbnail() ) : ?>
|
|
<?php the_post_thumbnail( 'full' ); ?>
|
|
<?php else : ?>
|
|
<img src="<?php echo esc_url( plugin_dir_url( __FILE__ ) . 'assets/images/placeholder-banner.jpg' ); ?>" alt="<?php esc_attr_e( 'Project Banner', 'projects-wp' ); ?>">
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="project-main-content">
|
|
<div class="project-description">
|
|
<h1 class="project-title">
|
|
<?php
|
|
do_action( 'projects_portfolio_single_title_before' );
|
|
the_title();
|
|
do_action( 'projects_portfolio_single_title_after' );
|
|
?>
|
|
</h1>
|
|
<?php
|
|
do_action( 'projects_portfolio_single_content_before' );
|
|
the_content();
|
|
do_action( 'projects_portfolio_single_content_after' );
|
|
?>
|
|
</div>
|
|
<div class="project-sidebar">
|
|
<div class="project-buttons">
|
|
<a href="<?php echo esc_url( site_url( '/download/' . $project_id ) ); ?>" class="button project-download-button">
|
|
<?php esc_html_e( 'Download Now', 'projects-wp' ); ?>
|
|
</a>
|
|
<?php if ( $repo_url ) : ?>
|
|
<a href="<?php echo esc_url( $browse_url ); ?>" class="button project-repo-button" target="_blank" rel="noopener noreferrer">
|
|
<?php esc_html_e( 'View Repo', 'projects-wp' ); ?>
|
|
</a>
|
|
<?php else : ?>
|
|
<p><?php esc_html_e( 'Repository:', 'projects-wp' ); ?> <?php esc_html_e( 'No repository linked.', 'projects-wp' ); ?></p>
|
|
<?php endif; ?>
|
|
<?php do_action( 'projects_after_download_button', $project_id ); ?>
|
|
</div>
|
|
|
|
<div class="project-meta">
|
|
<?php
|
|
do_action( 'projects_portfolio_single_meta_before' );
|
|
?>
|
|
<table class="project-meta-table">
|
|
<tbody>
|
|
<?php if ( $settings['templates']['version'] ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'Version:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $version ); ?></td>
|
|
</tr>
|
|
<?php endif; ?>
|
|
<?php if ( $settings['templates']['last_updated'] && $last_updated ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'Updated:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $last_updated ); ?></td>
|
|
</tr>
|
|
<?php endif; ?>
|
|
<?php if ( $settings['templates']['license'] && $license ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'License:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $license ); ?></td>
|
|
</tr>
|
|
<?php endif; ?>
|
|
<?php if ( $settings['templates']['language'] && $language ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'Language:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $language ); ?></td>
|
|
</tr>
|
|
<?php endif; ?>
|
|
<?php if ( $settings['templates']['downloads'] ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'Downloads:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $download_count ); ?></td>
|
|
</tr>
|
|
<?php endif; ?>
|
|
<?php
|
|
if ( ! empty( $repo_data ) ) :
|
|
if ( isset( $repo_data['stargazers_count'] ) && $settings['templates']['stargazers_count'] ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'Stars:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $repo_data['stargazers_count'] ); ?></td>
|
|
</tr>
|
|
<?php endif;
|
|
if ( isset( $repo_data['forks_count'] ) && $settings['templates']['forks'] ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'Forks:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $repo_data['forks_count'] ); ?></td>
|
|
</tr>
|
|
<?php endif;
|
|
if ( isset( $repo_data['open_issues_count'] ) && $settings['templates']['open_issues_count'] ) : ?>
|
|
<tr>
|
|
<th><?php esc_html_e( 'Issues:', 'projects-wp' ); ?></th>
|
|
<td><?php esc_html_e( $repo_data['open_issues_count'] ); ?></td>
|
|
</tr>
|
|
<?php endif;
|
|
endif;
|
|
?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<?php if ( $settings['templates']['github_owner'] && $owner_avatar && $owner_name ) : ?>
|
|
<div class="project-owner">
|
|
<span class="project-owner-avatar" style="display:block !important;width:40px !important;height:40px !important;min-width:40px !important;min-height:40px !important;max-width:40px !important;max-height:40px !important;border-radius:50% !important;background-image:url('<?php echo esc_url( $owner_avatar ); ?>') !important;background-size:40px 40px !important;background-position:center center !important;background-repeat:no-repeat !important;flex-shrink:0 !important;flex-grow:0 !important;" aria-label="<?php echo esc_attr( $owner_name ); ?>" role="img"></span>
|
|
<span class="project-owner-name">
|
|
<a href="<?php echo esc_url( $owner_url ); ?>" target="_blank" rel="noopener noreferrer"><?php echo esc_html( $owner_name ); ?></a>
|
|
</span>
|
|
<span class="project-owner-follow">
|
|
<a class="button project-follow-button" href="<?php echo esc_url( $owner_url ); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Follow', 'projects-wp' ); ?></a>
|
|
</span>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php
|
|
do_action( 'projects_portfolio_single_meta_after' );
|
|
?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
if ( $is_fse_theme ) {
|
|
wp_footer();
|
|
echo do_blocks( '<!-- wp:template-part {"slug":"footer"} /-->' );
|
|
} else {
|
|
get_footer();
|
|
}
|
|
?>
|
|
</body>
|
|
|
|
<?php
|
|
|
|
/**
|
|
* Enqueues theme styles specifically for single and archive pages of the "projects" post type.
|
|
*
|
|
* @since 1.0.0
|
|
* @return void
|
|
*/
|
|
function projects_portfolio_enqueue_theme_styles() {
|
|
if ( is_singular( 'projects' ) || is_post_type_archive( 'projects' ) ) {
|
|
// Enqueue the theme's main stylesheet.
|
|
wp_enqueue_style( 'theme-style', get_stylesheet_uri() );
|
|
|
|
// Enqueue additional theme styles if needed.
|
|
wp_enqueue_style( 'theme-header-style', get_template_directory_uri() . '/css/header.css' );
|
|
wp_enqueue_style( 'theme-footer-style', get_template_directory_uri() . '/css/footer.css' );
|
|
}
|
|
}
|
|
add_action( 'wp_enqueue_scripts', 'projects_portfolio_enqueue_theme_styles' );
|