Troligtvis är adressen fel, ofta kan detta uppstå när man deployar wp-config via deployverktyg och det är felkonfat. Pluginet lagar sig själv om man laddar om i admin, då kan man se vilken sökväg det ska vara. Det ska alltså vara sökvägen till pluginmappen och inte cache-mappen i wp-content.
The constant is not defined until after the plugin loads. This error is possible if the line ”require_once(ABSPATH . ’wp-settings.php’);” is present in wp-config.php . WPCACHEHOME is probably being defined after this line, but needs to be defined above it.
// Enable Debug logging to the /wp-content/debug.log file
define( 'WP_DEBUG_LOG', true );
function track_redirects_in_template() {
if ( did_action( 'wp_redirect' ) ) {
error_log( 'Redirect action triggered in template.' );
} else {
error_log( 'No redirect detected in template.' );
}
}
add_action( 'template_redirect', 'track_redirects_in_template' );
function check_is_singular_essay() {
if ( is_singular( 'my-cpt' ) ) {
error_log( 'My CPT post is being accessed.' );
global $post;
error_log( 'We are on: ' . $post->ID );
}
}
add_action( 'wp_head', 'check_is_singular_essay' );
DELETE FROM `toolwp_actionscheduler_actions` WHERE `status` = 'complete'
DELETE FROM `toolwp_actionscheduler_actions` WHERE `status` = 'canceled'
DELETE FROM `toolwp_actionscheduler_actions` WHERE `status` = 'failed'
Retrieve or display hidden nonce field for a form.
The nonce field is used to validate that the contents of the form came from the location on the current site and not somewhere else. The nonce does not offer absolute protection, but should protect against most cases. It is very important to use nonce field in forms.
The $action and $name are optional, but if you want to have better security, it is strongly suggested to set those two parameters. It is easier to just call the function without any parameters, because validation of the nonce doesn’t require any parameters, but since crackers know what the default is it won’t be difficult for them to find a way around your nonce and cause damage.
The input name will be whatever $name value you gave. The input value will be the nonce creation value.
$action(int/string) Action name. The nonce token is generated based on it. Default: -1
$name (string) The value of the name attribute of the input HTML tag. The value of the field can be taken from $_POST[ $name ] variable. Default: ’_wpnonce’
$referer (true/false) Whether to set a referer field for validation. Hidden referer field can be added along with the nonce field. Also, such referer field can be added separately with wp_referer_field() function. Default: true
$echo(true/false) false — don’t print, return the data to the variable for further handling. Default: true
Form data verification
<form method="post">
<!-- some inputs here ... -->
<?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>
If request data is received in the admin panel, it can be verified with check_admin_referer() function. If the verification has not been passed, then check_admin_referer() automatically print the error message and stop the further PHP execution — so there’s no need to specify what to do if the verification is failed.
function my_handler_function(){
// verification
// On failed verification, prints a error message and kills PHP execution.
check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' );
// data handling
}
I JS nedan skapar vi en checkruta på headingblocken som i sin tur lägger på en klass på elementet om ibockad. Längst ner hittar vi ipmAddExtraProps där vi lägger till den inmatade texten som data-attribut på elementet. På så vis kan vi använda samma text i en ::before-deklaration. Väldigt omständigt men det är ett sätt att göra det på om man inte kan injecta <span> och grejer runt texten.
import assign from 'lodash.assign';
import { appendClassNames } from './helpers/appendClassNames';
const { createHigherOrderComponent } = wp.compose;
const { Fragment } = wp.element;
const { InspectorControls } = wp.blockEditor;
const { PanelBody, SelectControl, CheckboxControl } = wp.components;
const { addFilter } = wp.hooks;
const { __, _x } = wp.i18n;
/**
* Add spacing control attribute to block.
*
* @param {object} settings Current block settings.
* @param {string} name Name of block.
*
* @returns {object} Modified block settings.
*/
const addControlAttributes = (settings, name) => {
// Do nothing if it's another block than our defined ones.
if (name !== 'core/heading') {
return settings;
}
// Use Lodash's assign to gracefully handle if attributes are undefined
settings.attributes = assign(settings.attributes, {
headingline: {
type: 'boolean',
default: false
}
});
return settings;
};
/**
* Create HOC to add spacing control to inspector controls of block.
*/
const additionalSettings = createHigherOrderComponent((BlockEdit) => {
return (props) => {
// Do nothing if it's another block than our defined ones.
if (props.name !== 'core/heading') {
return (
<BlockEdit {...props} />
);
}
const { headingline } = props.attributes;
return (
<Fragment>
<BlockEdit {...props} />
<InspectorControls>
<PanelBody
title={_x('Heading settings','heading line label', 'ipm-gef')}
initialOpen={false}
>
<CheckboxControl
label={_x('Line', 'heading line label', 'ipm-gef')}
checked={ headingline }
onChange={(selectedLineOption) => {
props.attributes.className = appendClassNames(props.attributes.className, 'has-heading-line', headingline, selectedLineOption)
props.setAttributes({
headingline: selectedLineOption,
});
}}
/>
</PanelBody>
</InspectorControls>
</Fragment>
);
};
}, 'additionalSettings');
addFilter('blocks.registerBlockType', 'ipm/settings/heading-attributes', addControlAttributes);
addFilter('editor.BlockEdit', 'ipm/settings/heading-controls', additionalSettings);
function ipmAddExtraProps(extraProps, blockType, attributes) {
if (blockType.name === 'core/heading' && attributes.headingline === true) {
return {
...extraProps,
'data-heading-content': attributes.content,
};
}
return extraProps;
}
addFilter('blocks.getSaveContent.extraProps', 'ipm/add-extra-props', ipmAddExtraProps);
Lägg till ditt mönster till filen pattern.{cpt}-template.php du skapade tidigare. Använd Gutenberg-redigeraren för att skapa mönstret och välj sedan Kopiera alla block från menyn (tre vertikala prickar) längst uppe till höger. Klistra sedan in detta i filen (exempel nedan). Kopiera inte över PHP-kommentarerna överst.
Glöm inte att byta ut {cpt} till namnet på din posttyp (eller valfritt).
Notera att man bara kan ha ett mönster per posttyp (vad jag vet) och om man ändrar mönstret i efterhand så kommer inte befintliga poster att uppdateras.
<?php
/**
* Title: A block template for {cpt}
* Slug: erik/{cpt}-template
* Inserter: false
*/
?>
<!-- wp:columns {"style":{"spacing":{"margin":{"bottom":"var:preset|spacing|30"}}},"marginBottom":"mb\u002d\u002dx2"} -->
<div class="wp-block-columns" style="margin-bottom:var(--wp--preset--spacing--30)"><!-- wp:column {"width":"33.33%"} -->
<div class="wp-block-column" style="flex-basis:33.33%"></div>
<!-- /wp:column -->
<!-- wp:column {"width":"66.66%"} -->
<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:paragraph {"className":"is-style-default"} -->
<p class="is-style-default">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent sit amet dapibus nibh. Mauris congue gravida velit, quis maximus leo molestie ut. Phasellus non nibh nunc. Donec efficitur leo nec tempor pulvinar. Nulla viverra pellentesque ultrices. Nam malesuada maximus facilisis. Proin felis tellus, lobortis nec pellentesque eu, sagittis non purus. Vivamus porta viverra felis, ut ornare velit. Vestibulum euismod eros lacus, eget posuere leo feugiat vel.</p>
<!-- /wp:paragraph --></div>
<!-- /wp:column --></div>
<!-- /wp:columns -->
<!-- wp:columns {"style":{"spacing":{"margin":{"bottom":"var:preset|spacing|30"}}}} -->
<div class="wp-block-columns" style="margin-bottom:var(--wp--preset--spacing--30)"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"className":"full-width","fullWidth":true} -->
<figure class="wp-block-image full-width"><img alt=""/></figure>
<!-- /wp:image --></div>
<!-- /wp:column -->
<!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"className":"full-width","fullWidth":true} -->
<figure class="wp-block-image full-width"><img alt=""/></figure>
<!-- /wp:image --></div>
<!-- /wp:column --></div>
<!-- /wp:columns -->
<!-- wp:group {"style":{"spacing":{"margin":{"bottom":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="margin-bottom:var(--wp--preset--spacing--40)"><!-- wp:image {"className":"full-width","fullWidth":true,"marginBottom":"mb\u002d\u002dx3"} -->
<figure class="wp-block-image full-width"><img alt=""/></figure>
<!-- /wp:image --></div>
<!-- /wp:group -->
Om du registrerar din posttyp i en klass så kör du patternfunktionerna i construct med:
public function __construct() {
add_action( 'init', array($this, 'erik_register_patterns') );
add_action( 'init', array($this, 'erik_register_pattern_categories') );
}
Om man vill utgå från ett formulär så har två av de största premium-formulärbyggarna för WordPress (något begränsade) betalningsalternativ man kan hänga på:
Från $49.50/år men kräver troligtvis $199.50 för att få ex Klarna
Easy Digital Downloads
Ett annat alternativ som påminner om WooCommerce (och är en otroligt stor lösning om man inte har fysiska produkter, tror det är den näst största i WP-sfären efter Woo) är Easy Digital Downloads.https://easydigitaldownloads.com/
Inkluderar Stripe och PayPal
Från €95/år – antagligen krävs dyrare nivå (€192 el. €288)
Precis som med WooCommerce bygger man ut med extra tillägg beroende på önskad funktionalitet. Woo har dock väldigt många fler (och fler svenskanpassade) lösningar enligt min uppfattning.
WooCommercebaserade lösningar
WooCommerce, världens största e-handelsverktyg och byggt som ett tillägg till WordPress. Man kan lägga upp en tjänst som en produkt. Det behöver inte vara fysiska produkter man säljer men det blir dock en skillnad i köpförfarandet. Man lägger produkt i varukorg kontra ett formulär med köpinfo (jämför Gravity, Ninja, WPSP ovan).
Manuella alternativ så som Gratis, Betala fysiskt (alltså en form av bokning), faktura/bankgiro ingår.
Klarna, Walley, Qliro, Worldline (tidigare Bambora), Svea m.fl. erbjuder färdiga gratis tillägg för att koppla ihop med WooCommerce. Jag tror att alla (osäker på Svea) innehåller bl.a. Swish som betalmetod.
Swish (för) handel
Redlight Media i Malmö erbjuder ett tillägg till WooCommerceför enbart Swishbetalning (960 kr/år). Notera att precis som med övriga betaltjänstleverantörer så tillkommer Swish egna kostnad. Kostnaderna skiljer sig åt beroende på ett antal faktorer som ex bank. Men ett prisexempel (lånat från Angry Creative så vet inte hur aktuellt det är 2023/2024) kan se ut så här, för att få en uppfattning:
WooCommerce: gratis
Swishtiullägg till WC: 960 kr/år
Uppläggningsavgift Swish: 1000 kr
Månads- eller årsavgift: ca 50 kr/mån alt. 500-1500 kr/år beroende på bank
Gratis tillägg, betala för respektive tjänst (gissningsvis månadsavgift + transaktionsavgift)
WooCommerce + Swish Handel
960 kr / år för swishtillägget + avtal med Swish (månadsavgift + transaktionsavgift)
Easy Digigtal Downloads
Gissningsvis €192 / år + avtal med ex Klarna (månadsavgift + transaktionsavgift)
WP Simple Pay
Gissningsvis $199,50 / år + avtal med ex Klarna (månadsavgift + transaktionsavgift)
Ninja Forms
Från $99/år (om Paypal funkar) men antagligen $199 / år + avtal med ex Stripe (transaktionsavgift + procentuell avgift – helt beroende på Stripelösning och om man ex har Klarna därigenom)
Gravity Forms
$159 / år, då ingår PayPal Checkout eller Stripe. Tillkommer transaktionsavgift + procentuell avgift – helt beroende på Stripelösning och om man ex har Klarna därigenom
Jag tror att man tänka att det kostar som minst ~ 2 000 kr / år oavsett tjänst man väljer. Exklusive att jag rekommenderar att hålla sajt och tillägg ajour (gärna 3-4 gånger per år) för att undvika säkerhetshål, att något går sönder eller för den delen få nya features. Samt att det totalt tenderar att gå mindre tid vid mindre insatser ofta, än om man skulle göra en stor uppdatering vid färre tillfällen (1 gång/år eller mer sällan).
Prisexempel från Klarna är ruggigt svårt att hitta men jag har exempelpriser nedan men osäker hur gamla dessa är:
Fast avgift per transaktion: 3,50 SEK
Rörlig avgift på transaktionsvärde: 2.79%
Säljer man en produkt för 1 000 kr på ett år skulle det då innebära minst 2 000 kr för att använda tjänsterna samt strax över 30 kr i transaktionsavgifter (Klarna).
add_action( 'wp_before_admin_bar_render', 'change_admin_logo_link' );
function change_admin_logo_link() {
global $wp_admin_bar;
// Get the logo node
$menu_node = $wp_admin_bar->get_node('wp-logo');
// Change the link to wp-admin
$menu_node->href = network_admin_url();
// Add the modified node back
$wp_admin_bar->add_node( $menu_node );
// Clean up
unset( $menu_node );
}
/*
* Login check and redirect to login page
*
*/
function check_login() {
// If user not logged in and not login page showing
// show the login page for the extranet
if (!is_user_logged_in() && !is_login_page()) {
require 'login.php';
exit;
}
}
// Function to check if page showing is login page
function is_login_page() {
return in_array($GLOBALS['pagenow'], array('wp-login.php'));
}
// Add ancestor-classes to nav menu when on single posts
add_filter( 'nav_menu_css_class', 'custom_menu_classes', 10, 2 );
function custom_menu_classes( $classes , $item ){
if ( get_post_type() == 'case' ) {
// remove unwanted classes if found
$classes = str_replace( 'current-page-ancestor', '', $classes );
// find the id you want and add the class you want
if ( $item->object_id == 10 ) {
$classes[] = 'current-page-ancestor current-menu-ancestor';
}
}
return $classes;
}