From 64f6de30fb546c63b758a2a3cc834c2e12155683 Mon Sep 17 00:00:00 2001 From: gustavo Date: Mon, 14 Jul 2025 07:33:32 +0000 Subject: [PATCH] first commit --- 404.php | 11 ++ LICENSE | 7 + README.md | 36 ++++++ archive.php | 39 ++++++ assets/fonts/.gitkeep | 0 assets/images/.gitkeep | 0 assets/scripts/site.js | 5 + assets/styles/.gitkeep | 0 author.php | 18 +++ composer.json | 75 +++++++++++ functions.php | 19 +++ humans.txt | 10 ++ index.php | 27 ++++ page.php | 17 +++ phpcs.xml.dist | 32 +++++ phpstan.neon | 15 +++ phpunit.xml | 14 ++ screenshot.png | Bin 0 -> 13031 bytes search.php | 18 +++ single.php | 20 +++ src/StarterSite.php | 186 +++++++++++++++++++++++++++ style.css | 5 + tests/bootstrap.php | 28 ++++ tests/test-timber-starter-theme.php | 64 +++++++++ views/layouts/base.twig | 43 +++++++ views/partials/comment-form.twig | 32 +++++ views/partials/comment.twig | 19 +++ views/partials/footer.twig | 1 + views/partials/head.twig | 9 ++ views/partials/menu.twig | 12 ++ views/partials/pagination.twig | 44 +++++++ views/partials/tease-post.twig | 16 +++ views/partials/tease.twig | 9 ++ views/templates/404.twig | 5 + views/templates/archive.twig | 15 +++ views/templates/author.twig | 7 + views/templates/index.twig | 16 +++ views/templates/page.twig | 12 ++ views/templates/search.twig | 18 +++ views/templates/single-password.twig | 17 +++ views/templates/single.twig | 37 ++++++ 41 files changed, 958 insertions(+) create mode 100644 404.php create mode 100644 LICENSE create mode 100644 README.md create mode 100644 archive.php create mode 100644 assets/fonts/.gitkeep create mode 100644 assets/images/.gitkeep create mode 100644 assets/scripts/site.js create mode 100644 assets/styles/.gitkeep create mode 100644 author.php create mode 100644 composer.json create mode 100644 functions.php create mode 100644 humans.txt create mode 100644 index.php create mode 100644 page.php create mode 100644 phpcs.xml.dist create mode 100644 phpstan.neon create mode 100644 phpunit.xml create mode 100644 screenshot.png create mode 100644 search.php create mode 100644 single.php create mode 100644 src/StarterSite.php create mode 100644 style.css create mode 100644 tests/bootstrap.php create mode 100644 tests/test-timber-starter-theme.php create mode 100644 views/layouts/base.twig create mode 100644 views/partials/comment-form.twig create mode 100644 views/partials/comment.twig create mode 100644 views/partials/footer.twig create mode 100644 views/partials/head.twig create mode 100644 views/partials/menu.twig create mode 100644 views/partials/pagination.twig create mode 100644 views/partials/tease-post.twig create mode 100644 views/partials/tease.twig create mode 100644 views/templates/404.twig create mode 100644 views/templates/archive.twig create mode 100644 views/templates/author.twig create mode 100644 views/templates/index.twig create mode 100644 views/templates/page.twig create mode 100644 views/templates/search.twig create mode 100644 views/templates/single-password.twig create mode 100644 views/templates/single.twig diff --git a/404.php b/404.php new file mode 100644 index 0000000..a51168d --- /dev/null +++ b/404.php @@ -0,0 +1,11 @@ + $title, + ] +); + +Timber::render( $templates, $context ); diff --git a/assets/fonts/.gitkeep b/assets/fonts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/assets/images/.gitkeep b/assets/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/assets/scripts/site.js b/assets/scripts/site.js new file mode 100644 index 0000000..6655bd0 --- /dev/null +++ b/assets/scripts/site.js @@ -0,0 +1,5 @@ +jQuery( document ).ready( function( $ ) { + + // Your JavaScript goes here + +}); \ No newline at end of file diff --git a/assets/styles/.gitkeep b/assets/styles/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/author.php b/author.php new file mode 100644 index 0000000..dae48bc --- /dev/null +++ b/author.php @@ -0,0 +1,18 @@ +name() ); +} + +Timber::render( [ 'templates/author.twig', 'templates/archive.twig' ], $context ); diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..1e1dcd5 --- /dev/null +++ b/composer.json @@ -0,0 +1,75 @@ +{ + "name": "timber/starter-theme", + "description": "Starter theme to build a Timber theme", + "type":"wordpress-theme", + "license": "MIT", + "authors": [ + { + "name": "Erik van der Bas", + "email": "erik@basedonline.nl", + "homepage": "https://basedonline.nl" + }, + { + "name": "Lukas Gächter", + "email": "lukas.gaechter@mind.ch", + "homepage": "https://www.mind.ch" + }, + { + "name": "Nicolas Lemoine", + "email": "nico@n5s.dev", + "homepage": "https://n5s.dev" + }, + { + "name": "Jared Novack", + "email": "jared@upstatement.com", + "homepage": "https://upstatement.com" + }, + { + "name": "Timber Community", + "homepage": "https://github.com/timber/timber" + } + ], + "repositories": [ + { + "type": "composer", + "url": "https://wpackagist.org" + } + ], + "require": { + "timber/timber": "^2.1" + }, + "require-dev": { + "automattic/wordbless": "^0.4.2", + "yoast/wp-test-utils": "^1.0", + "wp-coding-standards/wpcs": "^3.1", + "phpcompatibility/php-compatibility": "^9", + "szepeviktor/phpstan-wordpress": "^1.3", + "10up/phpcs-composer": "^3.0" + }, + "extra": { + "installer-paths": { + "vendor/automattic/wordbless/": [ + "automattic/wordbless" + ] + }, + "wordpress-install-dir": "wordpress" + }, + "config": { + "allow-plugins": { + "roots/wordpress-core-installer": true, + "composer/installers": true, + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "scripts": { + "test": "phpunit", + "cs": "@php ./vendor/bin/phpcs --colors -s -p -v ./", + "cs:fix": "@php ./vendor/bin/phpcbf --colors -s -p -v ./", + "phpstan": "@php ./vendor/bin/phpstan analyse" + } +} diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..76890b8 --- /dev/null +++ b/functions.php @@ -0,0 +1,19 @@ + 'bar', + ] +); + +Timber::render( $templates, $context ); diff --git a/page.php b/page.php new file mode 100644 index 0000000..34c142d --- /dev/null +++ b/page.php @@ -0,0 +1,17 @@ + + + + . + + */node_modules/* + */wordpress/* + */vendor/* + */resources/* + */dist/* + */tests/* + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..5ce8f6d --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,15 @@ +parameters: + editorUrl: 'vscode://file/%%file%%:%%line%%' + level: 5 # Increase until "max" + paths: + - src/ + - %currentWorkingDirectory%/ + excludePaths: + - tests/* + - docs/* + - vendor/* + - wordpress/* + ignoreErrors: + +includes: + - vendor/szepeviktor/phpstan-wordpress/extension.neon \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..c0f40d4 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,14 @@ + + + + ./tests/ + + + diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f37bb02e9897506b4c9583768cec5bb74f5110bd GIT binary patch literal 13031 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 JOv)_y{{Xml4yXVC literal 0 HcmV?d00001 diff --git a/search.php b/search.php new file mode 100644 index 0000000..9e1ac5f --- /dev/null +++ b/search.php @@ -0,0 +1,18 @@ + 'Search results for ' . get_search_query(), + ] +); + +Timber::render( $templates, $context ); diff --git a/single.php b/single.php new file mode 100644 index 0000000..df070cf --- /dev/null +++ b/single.php @@ -0,0 +1,20 @@ +post_type . '.twig', 'templates/single.twig' ]; + +if ( post_password_required( $post->ID ) ) { + $templates = 'templates/single-password.twig'; +} + +Timber::render( $templates, $context ); diff --git a/src/StarterSite.php b/src/StarterSite.php new file mode 100644 index 0000000..834eaad --- /dev/null +++ b/src/StarterSite.php @@ -0,0 +1,186 @@ + _x( 'Main menu', 'Backend - menu name', 'timber-starter' ), + ] + ); + + // Add default posts and comments RSS feed links to head. + add_theme_support( 'automatic-feed-links' ); + + /* + * Let WordPress manage the document title. + * By adding theme support, we declare that this theme does not use a + * hard-coded tag in the document head, and expect WordPress to + * provide it for us. + */ + add_theme_support( 'title-tag' ); + + /* + * Enable support for Post Thumbnails on posts and pages. + * + * @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/ + */ + add_theme_support( 'post-thumbnails' ); + + /* + * Switch default core markup for search form, comment form, and comments + * to output valid HTML5. + */ + add_theme_support( + 'html5', + [ + 'comment-form', + 'comment-list', + 'gallery', + 'caption', + ] + ); + + /* + * Enable support for Post Formats. + * + * See: https://codex.wordpress.org/Post_Formats + */ + add_theme_support( + 'post-formats', + [ + 'aside', + 'image', + 'video', + 'quote', + 'link', + 'gallery', + 'audio', + ] + ); + + add_theme_support( 'menus' ); + } + + /** + * This would return 'foo bar!'. + * + * @param string $text being 'foo', then returned 'foo bar!' + */ + public function myfoo( $text ) { + $text .= ' bar!'; + + return $text; + } + + /** + * This is where you can add your own functions to twig. + * + * @link https://timber.github.io/docs/v2/hooks/filters/#timber/twig/filters + * @param array $filters an array of Twig filters. + */ + public function add_filters_to_twig( $filters ) { + + $additional_filters = [ + 'myfoo' => [ + 'callable' => [ $this, 'myfoo' ], + ], + ]; + + return array_merge( $filters, $additional_filters ); + } + + + /** + * This is where you can add your own functions to twig. + * + * @link https://timber.github.io/docs/v2/hooks/filters/#timber/twig/functions + * @param array $functions an array of existing Twig functions. + */ + public function add_functions_to_twig( $functions ) { + $additional_functions = [ + 'get_theme_mod' => [ + 'callable' => 'get_theme_mod', + ], + ]; + + return array_merge( $functions, $additional_functions ); + } + + /** + * Updates Twig environment options. + * + * @see https://twig.symfony.com/doc/2.x/api.html#environment-options + * + * @param array $options an array of environment options + * + * @return array + */ + public function update_twig_environment_options( $options ) { + // $options['autoescape'] = true; + + return $options; + } +} diff --git a/style.css b/style.css new file mode 100644 index 0000000..90afb39 --- /dev/null +++ b/style.css @@ -0,0 +1,5 @@ +/* + * Theme Name: My Timber 2.x Starter Theme + * Description: Starter Theme to use with Timber + * Author: Timber Team and You! +*/ diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..fb3f982 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,28 @@ +<?php + +use WorDBless\Load; + +if (! file_exists(dirname(__DIR__) . '/wordpress/wp-content')) { + mkdir(dirname(__DIR__) . '/wordpress/wp-content'); +} + +if (! file_exists(dirname(__DIR__) . '/wordpress/wp-content/themes')) { + mkdir(dirname(__DIR__) . '/wordpress/wp-content/themes'); +} + +copy( + dirname(__DIR__) . '/vendor/automattic/wordbless/src/dbless-wpdb.php', + dirname(__DIR__) . '/wordpress/wp-content/db.php' +); + +$theme_base_name = basename(dirname(__DIR__)); +$src = realpath(dirname(dirname(__DIR__)) . '/' . $theme_base_name); +$dest = dirname(__DIR__) . '/wordpress/wp-content/themes/' . $theme_base_name; + +if ( is_dir($src) && ! file_exists($dest) ) { + symlink($src, $dest); +} + +require_once dirname(__DIR__) . '/vendor/autoload.php'; + +Load::load(); diff --git a/tests/test-timber-starter-theme.php b/tests/test-timber-starter-theme.php new file mode 100644 index 0000000..6f02aa4 --- /dev/null +++ b/tests/test-timber-starter-theme.php @@ -0,0 +1,64 @@ +<?php + +use Timber\Timber; +use WorDBless\BaseTestCase; + +class TestTimberStarterTheme extends BaseTestCase +{ + + public function set_up() + { + switch_theme(basename(dirname(__DIR__)) . '/theme'); + + require dirname(__DIR__) . '/functions.php'; + + Timber::$dirname = array_merge((array) Timber::$dirname, ['../views']); + Timber::$dirname = array_unique(Timber::$dirname); + + // WorDBless includes wp-settings.php + do_action('after_setup_theme'); + + parent::set_up(); + } + + function tear_down() + { + parent::tear_down(); + switch_theme('twentytwenty'); + } + + function testTimberExists() + { + $context = Timber::context(); + $this->assertTrue(is_array($context)); + } + + function testFunctionsPHP() + { + $context = Timber::context(); + $this->assertEquals('App\StarterSite', get_class($context['site'])); + $this->assertTrue(current_theme_supports('post-thumbnails')); + $this->assertEquals('bar', $context['foo']); + } + + function testLoading() + { + $str = Timber::compile('partials/tease.twig'); + $this->assertStringStartsWith('<article class="tease tease-" id="tease-">', $str); + $this->assertStringEndsWith('</article>', $str); + } + + /** + * Helper test to output current twig version + */ + function testTwigVersion() + { + $version = Timber::compile_string("{{ version }}", ['version' => Twig\Environment::VERSION]); + $this->assertEquals(Twig\Environment::VERSION, $version); + } + + // function testTwigFilter() { + // $str = Timber::compile_string('{{ "foo"|myfoo }}'); + // $this->assertEquals('foo bar!', $str); + // } +} diff --git a/views/layouts/base.twig b/views/layouts/base.twig new file mode 100644 index 0000000..537c08d --- /dev/null +++ b/views/layouts/base.twig @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html {{ site.language_attributes }}> + {% block head %} + {% include 'partials/head.twig' %} + {% endblock %} + + <body class="{{ body_class }}"> + {{ function('wp_body_open') }} + <a class="skip-link screen-reader-text" href="#content">{{ _e('Skip to content') }}</a> + <header class="header"> + {% block header %} + <div class="wrapper"> + <h1 class="hdr-logo"> + <a class="hdr-logo-link" href="{{ site.url }}">{{ site.name }}</a> + </h1> + <nav id="nav-main" class="nav-main"> + {% include 'partials/menu.twig' with { + items: menu.get_items + } %} + </nav> + <!-- #nav --> + </div> + {% endblock %} + </header> + + <section id="content" class="content-wrapper"> + {% if title %} + <h1>{{ title }}</h1> + {% endif %} + <div class="wrapper"> + {% block content %} + Sorry, no content + {% endblock %} + </div> + </section> + + {% block footer %} + {% include 'partials/footer.twig' %} + {% endblock %} + {{ function('wp_footer') }} + {% do action('get_footer') %} + </body> +</html> diff --git a/views/partials/comment-form.twig b/views/partials/comment-form.twig new file mode 100644 index 0000000..565f4b6 --- /dev/null +++ b/views/partials/comment-form.twig @@ -0,0 +1,32 @@ +<div class="comment-form"> + <h3>Add comment</h3> + <form class="comment-form" method="post" action="{{ site.link ~ '/wp-comments-post.php' }}"> + {% if user %} + <input type="hidden" name="email" value="{{ user.email }}" /> + <input type="hidden" name="author" value="{{ user.name }}" /> + <input type="hidden" name="url" value="{{ user.link }}" /> + {% else %} + <label> + Email<br /> + <input required name="email" type="email" id="email" /> + </label> + <label> + Name<br /> + <input required name="author" type="text" /> + </label> + <label> + Website<br /> + <input name="url" type="url" /> + </label> + {% endif %} + <label> + Comment<br /> + <textarea placeholder="Leave a comment..." name="comment" cols="60" rows="3"></textarea> + </label> + <input name="comment_post_ID" value="{{ post.id }}" type="hidden" /> + <input name="comment_parent" value="{{ comment.id|default('0') }}" type="hidden" /> + <button type="submit" name="Submit" class="btn">Send</button> + <button type="reset">Cancel</button> + <p>Your comment will be revised by the site if needed.</p> + </form> +</div> diff --git a/views/partials/comment.twig b/views/partials/comment.twig new file mode 100644 index 0000000..710f979 --- /dev/null +++ b/views/partials/comment.twig @@ -0,0 +1,19 @@ +<div class="blog-comment" id="blog-comment-{{ comment.id }}"> + <h5 class="comment-author">{{ comment.author.name }} says</h5> + <div class="comment-content">{{ comment.content|wpautop }}</div> + + <section class="comment-box"> + {% include 'partials/comment-form.twig' %} + + {% if post.comments %} + <h4>replies</h4> + <div class="comments"> + {% for cmt in comment.children %} + {% include 'partials/comment.twig' with { + comment: cmt + } %} + {% endfor %} + </div> + {% endif %} + </section> +</div> diff --git a/views/partials/footer.twig b/views/partials/footer.twig new file mode 100644 index 0000000..606165c --- /dev/null +++ b/views/partials/footer.twig @@ -0,0 +1 @@ +<footer id="footer">Copyright {{ 'now'|date('Y') }}</footer> diff --git a/views/partials/head.twig b/views/partials/head.twig new file mode 100644 index 0000000..ea68c2a --- /dev/null +++ b/views/partials/head.twig @@ -0,0 +1,9 @@ +<head> + <meta charset="{{ site.charset }}" /> + <link rel="stylesheet" href="{{ site.theme.link }}/style.css" type="text/css" media="screen" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="author" href="{{ site.theme.link }}/humans.txt" /> + <link rel="profile" href="http://gmpg.org/xfn/11" /> + {% do action('get_header') %} + {{ function('wp_head') }} +</head> diff --git a/views/partials/menu.twig b/views/partials/menu.twig new file mode 100644 index 0000000..377dc98 --- /dev/null +++ b/views/partials/menu.twig @@ -0,0 +1,12 @@ +{% if menu %} + <ul> + {% for item in items %} + <li class="{{ item.classes|join(' ') }}"> + <a target="{{ item.target }}" href="{{ item.link }}">{{ item.title }}</a> + {% include 'partials/menu.twig' with { + items: item.children + } %} + </li> + {% endfor %} + </ul> +{% endif %} diff --git a/views/partials/pagination.twig b/views/partials/pagination.twig new file mode 100644 index 0000000..e4d737b --- /dev/null +++ b/views/partials/pagination.twig @@ -0,0 +1,44 @@ +{% if posts.pagination.pages is not empty %} + <nav class="pagination-block"> + <ul class="pagination"> + {# First #} + {% if (posts.pagination.pages|first) and posts.pagination.pages|first.current != true %} + <li class="first btn"> + <a href="{{ posts.pagination.pages|first.link }}">First</a> + </li> + {% else %} + <li class="first btn disabled"><button disabled>First</button></li> + {% endif %} + + {# Previous #} + {% if posts.pagination.prev %} + <li class="prev btn"><a href="{{ posts.pagination.prev.link }}">Previous</a></li> + {% else %} + <li class="prev btn disabled"><button disabled>Previous</button></li> + {% endif %} + + {# Pages #} + {% for page in posts.pagination.pages %} + {% if page.link %} + <li><a href="{{ page.link }}" class="{{ page.class }}">{{ page.title }}</a></li> + {% else %} + <li class="current"><span class="{{ page.class }}">{{ page.title }}</span></li> + {% endif %} + {% endfor %} + + {# Next #} + {% if posts.pagination.next %} + <li class="next btn"><a href="{{ posts.pagination.next.link }}">Next</a></li> + {% else %} + <li class="next btn disabled"><button disabled>Next</button></li> + {% endif %} + + {# Last #} + {% if (posts.pagination.pages|last) and posts.pagination.pages|last.current != true %} + <li class="last btn"><a href="{{ posts.pagination.pages|last.link }}">Last</a></li> + {% else %} + <li class="last btn disabled"><button disabled>Last</button></li> + {% endif %} + </ul> + </nav> +{% endif %} diff --git a/views/partials/tease-post.twig b/views/partials/tease-post.twig new file mode 100644 index 0000000..5a08767 --- /dev/null +++ b/views/partials/tease-post.twig @@ -0,0 +1,16 @@ +{% extends 'partials/tease.twig' %} + +{% block content %} + <h2 class="h2"><a href="{{ post.link }}">{{ post.title }}</a></h2> + <p> + {{ + post.excerpt({ + words: 5, + read_more: 'Keep reading' + }) + }} + </p> + {% if post.thumbnail.src %} + <img src="{{ post.thumbnail.src }}" /> + {% endif %} +{% endblock %} diff --git a/views/partials/tease.twig b/views/partials/tease.twig new file mode 100644 index 0000000..1a0f7b0 --- /dev/null +++ b/views/partials/tease.twig @@ -0,0 +1,9 @@ +<article class="tease tease-{{ post.type }}" id="tease-{{ post.id }}"> + {% block content %} + <h2 class="h2"><a href="{{ post.link }}">{{ post.title }}</a></h2> + <p>{{ post.excerpt }}</p> + {% if post.thumbnail %} + <img src="{{ post.thumbnail.src }}" /> + {% endif %} + {% endblock %} +</article> \ No newline at end of file diff --git a/views/templates/404.twig b/views/templates/404.twig new file mode 100644 index 0000000..1b2073c --- /dev/null +++ b/views/templates/404.twig @@ -0,0 +1,5 @@ +{% extends 'layouts/base.twig' %} + +{% block content %} + Sorry, we couldn't find what you're looking for. +{% endblock %} diff --git a/views/templates/archive.twig b/views/templates/archive.twig new file mode 100644 index 0000000..ae021ea --- /dev/null +++ b/views/templates/archive.twig @@ -0,0 +1,15 @@ +{% extends 'layouts/base.twig' %} + +{% block content %} + {% for post in posts %} + {% include ['partials/tease-' ~ post.type ~ '.twig', 'partials/tease.twig'] %} + {% endfor %} + + {% include 'partials/pagination.twig' with { + pagination: posts.pagination({ + show_all: false, + mid_size: 3, + end_size: 2 + }) + } %} +{% endblock %} diff --git a/views/templates/author.twig b/views/templates/author.twig new file mode 100644 index 0000000..6d19761 --- /dev/null +++ b/views/templates/author.twig @@ -0,0 +1,7 @@ +{% extends 'layouts/base.twig' %} + +{% block content %} + {% for post in posts %} + {% include ['partials/tease-' ~ post.type ~ '.twig', 'partials/tease.twig'] %} + {% endfor %} +{% endblock %} diff --git a/views/templates/index.twig b/views/templates/index.twig new file mode 100644 index 0000000..b68fbd7 --- /dev/null +++ b/views/templates/index.twig @@ -0,0 +1,16 @@ +{% extends 'layouts/base.twig' %} + +{% block content %} + <h2>{{ foo }}</h2> + {% for post in posts %} + {% include ['partials/tease-' ~ post.type ~ '.twig', 'partials/tease.twig'] %} + {% endfor %} + + {% include 'partials/pagination.twig' with { + pagination: posts.pagination({ + show_all: false, + mid_size: 3, + end_size: 2 + }) + } %} +{% endblock %} diff --git a/views/templates/page.twig b/views/templates/page.twig new file mode 100644 index 0000000..7709c52 --- /dev/null +++ b/views/templates/page.twig @@ -0,0 +1,12 @@ +{% extends 'layouts/base.twig' %} + +{% block content %} + <div class="content-wrapper"> + <article class="post-type-{{ post.type }}" id="post-{{ post.id }}"> + <section class="article-content"> + <h1 class="article-h1">{{ post.title }}</h1> + <div class="article-body">{{ post.content }}</div> + </section> + </article> + </div> +{% endblock %} diff --git a/views/templates/search.twig b/views/templates/search.twig new file mode 100644 index 0000000..f8853a6 --- /dev/null +++ b/views/templates/search.twig @@ -0,0 +1,18 @@ +{# see `templates/archive.twig` for an alternative strategy of extending templates #} +{% extends 'layouts/base.twig' %} + +{% block content %} + <div class="content-wrapper"> + {% for post in posts %} + {% include ['partials/tease-' ~ post.type ~ '.twig', 'partials/tease.twig'] %} + {% endfor %} + + {% include 'partials/pagination.twig' with { + pagination: posts.pagination({ + show_all: false, + mid_size: 3, + end_size: 2 + }) + } %} + </div> +{% endblock %} diff --git a/views/templates/single-password.twig b/views/templates/single-password.twig new file mode 100644 index 0000000..fc62761 --- /dev/null +++ b/views/templates/single-password.twig @@ -0,0 +1,17 @@ +{% extends 'layouts/base.twig' %} + +{% block content %} + <form class="password-form" + action="{{ site.link }}/wp-login.php?action=postpass" + method="post"> + <label for="pwbox-{{ post.id }}">Password:</label> + <input class="password-box" + name="post_password" + id="pwbox-{{ post.id }}" + type="password" + placeholder="Password" + size="20" + maxlength="20" /> + <input class="password-btn" type="submit" name="Submit" value="Submit" /> + </form> +{% endblock %} diff --git a/views/templates/single.twig b/views/templates/single.twig new file mode 100644 index 0000000..584450d --- /dev/null +++ b/views/templates/single.twig @@ -0,0 +1,37 @@ +{% extends 'layouts/base.twig' %} + +{% block content %} + <div class="content-wrapper"> + <article class="post-type-{{ post.type }}" id="post-{{ post.id }}"> + <img src="{{ post.thumbnail.src|resize(1200, 300) }}" /> + <section class="article-content"> + <h1 class="article-h1">{{ post.title }}</h1> + <p class="blog-author"> + <span>By</span> + <a href="{{ post.author.path }}">{{ post.author.name }}</a> + <span>•</span> + <time datetime="{{ post.date|date('Y-m-d H:i:s') }}">{{ post.date }}</time> + </p> + <div class="article-body">{{ post.content }}</div> + </section> + <section class="comment-box"> + <div class="comments"> + {% if post.comments %} + <h3>comments</h3> + {% for cmt in post.comments %} + {% include 'partials/comment.twig' with { + comment: cmt + } %} + {% endfor %} + {% endif %} + </div> + + {% if post.comment_status == 'closed' %} + <p>comments for this post are closed</p> + {% else %} + {% include 'partials/comment-form.twig' %} + {% endif %} + </section> + </article> + </div> +{% endblock %}