Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
#1 Re: Core development » Request for testers: PHP 7.3 compatibility » 2019-03-10 15:34:31
- whocarez
That’s for my “title_id” permanent links mode … I’m to stupid and lazy to write a plugin, so I’m patching this site every time. Title before ID because of SEO – putting the keywords to the front – and ID is needed because of Google News. They want a unique article id of at least four digits, as far as I remember.
So I couldn’t use neither “id_title” nor “title_only” for this site.
#2 Re: Textpattern platforms and channels » Forum search not working? [resolved. thanks!] » 2019-02-26 08:45:29
- phiw13
jakob wrote #316737:
I just get a long long wait with no results. Quite calming really if you’re not in a hurry!
lovely :-)
The search tab at the top left (advanced search) does work
The top-right search box is a google search thingie ?
PS – I see now (safari):
[Error] Refused to load https://forum.textpattern.com/search.php?action=search&show_as=posts&sort_dir=DESC&keywords=test because it does not appear in the form-action directive of the Content Security Policy.
#3 Re: Feature ideas » considering images » 2019-02-12 13:10:23
- ia278
Hey guys – thought I’d add an SEO suggestion on here.
From what I’ve been told, Google uses the name of an image to help index it – and so, it’s good practice to name it something that includes your desired keywords. For example, a picture of the moon would rank much higher if it the URL linked to an image ending in its name moon.jpg instead of ID 143.jpg – which is what currently happens now.
At the same time, I know that the decision to name images by their ID was probably taken years ago – and with years of code and releases based on this, any solution needs to be backward compatible.
“Here’s my attempt of a fix on the front end.

The dropdown could have a few options (/id, /name, /name/id etc.), but here’s where my knowledge starts to get strained. I know that there’s a txtptrn_txp_image table inside the database – is there a way of being able to use this to rewrite the names of files inside the images folder depending on the option selected in the Preferences panel?
#4 Re: General discussions » Txp cookies, visitor logging, and GDPR stuff in general » 2019-02-01 12:51:12
- Destry
colak wrote #316385:
. . . privacy, surveillance and the like, are keywords used in the algorithmic profiling from the intel agencies.
Without a doubt. And it’s all going here. What they don’t say there, but I’ve read elsewhere, is how massive their carbon footprint is too. It’s insane, like a second Dubai. A slight exaggeration only, but you get the picture. They could at least offset the environmental damage by putting the cruise line industries out of business, or something.
Speaking of NSA and UAE… The whole story makes me sick. But then, spies.
#5 Re: General discussions » Txp cookies, visitor logging, and GDPR stuff in general » 2019-01-31 15:48:44
- colak
Bloke wrote #316381:
Guess I must be a terrorist, not a citizen concerned about their privacy being leaked.
Funny you say that:) I understand that privacy, surveillance and the like, are keywords used in the algorithmic profiling from the intel agencies. This forum is screwed:)
#6 Re: How? » Make a section appear in a subdomain? » 2018-12-13 17:25:59
- jakob
Destry wrote #315567:
Lots of use cases. A few examples for just a personal site alone:
- resume.domain.tld : profile.domain.tld / bio.domain.tld
- social.domain.tld : masto.domain.tld
- blogroll.domain.tld
- library.domain.tld / biblio.domain.tld
- manifesto.domain.tld
- etc
… but I actually like these URL structures much better than this:
- domain.tld/resume/
- domain.tld/biblio/
- etc
I guess there’s nothing stopping you doing that but I’m not sure whether subdomains are such a great idea as a replacement for typical sections. In terms of SEO I guess that they are more or less equal: the keywords are there in the url with both variants. I’ve no idea whether one is rated better than the other. Another thing to watch out for is if you don’t have a wildcard certificate, you’ll need an SSL certificate for each subdomain (or extend your SSL certificate to include each new subdomain).
I do like subdomains as a way of segmenting or containing distinct data, e.g. your private site and your business site as you have done.
In my examples:
- the first example is really intended as a fixed URL that I can publish in a print document now and will be still be valid in 5 years time. We have general info pages on the certificates (environmental product declarations) on the regular site with a sample, but suppliers will need to produce these EPDs for their own products. At present, there are very few and I suspect a simple list will suffice (hence just making a section of the main site) but maybe in a few years time there will be a long list of products and I may need to provide a better search facility, or maybe a means by which the suppliers can manage their data themselves. At that point I could do switch to a dedicated setup for that subdomain.
- The second example is for instances of a concept, in this case “editions” of a summer school. I’m in two minds here. At present I’m converting an old weebly-based site to show the results from past summer schools so the section as a subdomain variant appeals to me. In future, the participants may need login access to the site, in which case it might be better to make separate multisites so that there’s no risk of external user logins being able to see/edit/delete material on the main site or on the other year’s sites because they’re totally separate instances.
etc wrote #315568:
Both are possible, just keep in mind that if you create a HTML type form to be used as page template, it will be available to any article via
f=mypageURL query.
I didn’t know that. Is that something that can be done with any section on any site? If so, that looks like a way of discovering information not intended for consumption. Maybe that needs locking down…
The second approach leaves you with more control since only the articles of the concerned sections will be able to use their page template. There is no “official” way to use another page than this assigned to the section afaik.
The second approach being to use txp:output_form form="my-section-page-as-a-form"?
since only the articles of the concerned sections will be able to use their page template.
Am I not going to have that problem either way, as I’m going to have to apply ied_if_domain to the default template anyway for the subdomain? You can use article_custom to show articles from another section and kind-of replicate the behaviour of txp:article, but it’s a bit laborious.
Might there be a way of doing something like this:
<txp:ied_if_domain domain="section.domain.com">
<!-- set section context to desired "section" -->
<!-- if using year subdomains, set category/date context to match "subdomain" -->
<!-- call form/page_template -->
<txp:else />
<!-- regular page template code -->
</txp:ied_if_domain>
Or can I only achieve that by making a plugin to do some special routing prior to the page template being called?
#7 Re: How? » [solved] Nth year counter from given start » 2018-11-06 17:18:35
- Destry
I think I’ve found the source of the Rhine. A form called head_context in the mag:
<txp:hide>
==========
Lists of sections that:
* have article content in them (in the order they should appear in lists)
* are aggregates (list-of-other-sections/categories)
* have advertising content (first empty item indicates front page)
==========
</txp:hide>
<txp:variable name="column_sections">from-the-editor, community-spotlight, site-watch, extensionalism, independents-frontline, hope-for-the-future, meaningful-labour</txp:variable>
<txp:variable name="aggregate_sections">columns, exhibit, issues, topics</txp:variable>
<txp:variable name="ad_sections">, advertise, columns, issues, topics, exhibit, <txp:variable name="column_sections" /></txp:variable>
<txp:php>
// query_columns is used in the "in_issue" macro
//TODO: incorporate this into issue_info() too?
global $variable;
$variable['query_columns'] = "'". join("','", do_list($variable['column_sections'])) . "'";
</txp:php>
<txp:hide>
==========
Can use these to test if value="1" in templates
==========
</txp:hide>
<txp:variable name="is_column"><txp:if_section name='<txp:variable name="column_sections" />'>1<txp:else />0</txp:if_section></txp:variable>
<txp:variable name="is_aggregate"><txp:if_section name='<txp:variable name="aggregate_sections" />'>1<txp:else />0</txp:if_section></txp:variable>
<txp:variable name="is_landing"><txp:if_individual_article>0<txp:else />1</txp:if_individual_article></txp:variable>
<txp:variable name="has_ads"><txp:if_section name='<txp:variable name="ad_sections" />'><txp:if_status status="404"><txp:if_section name="">0<txp:else />1</txp:if_section><txp:else />1</txp:if_status><txp:else />0</txp:if_section></txp:variable>
<txp:variable name="has_feed"><txp:php>global $pretext; echo safe_field('in_rss', 'txp_section', "name='".doSlash($pretext['s'])."'");</txp:php></txp:variable>
<txp:hide>
==========
Determine the Mag Issue context. It's either:
a) From the URL (/issues/N that has passed the gbp_permanent_link CF check)
b) From the current individual article's "Issue" custom field
c) From the Issue CF of the most recent past live article in the mag content
==========
</txp:hide>
<txp:variable name="issue" value="0" />
<txp:php>
function issue_info($iss = '0') {
global $variable, $pretext;
static $issue_row;
static $issue_stamp;
if (!isset($issue_row) && !$issue_row) {
$iss_clause = ($iss != '0' && is_numeric($iss)) ? " AND custom_1='".doSlash($iss)."'" : '';
$post_clause = (isset($pretext['month']) && $pretext['month']) ? " AND Posted LIKE '".doSlash($pretext['month'])."%'" : ' AND Posted < NOW()';
$issue_row = safe_row('MAX(custom_1) AS custom_1, MAX(Posted) AS Posted', 'textpattern', "Section IN (" . join(',', quote_list(do_list($variable['column_sections']))) . ")" . $post_clause . " AND Status='4'" . $iss_clause);
$issue_stamp = strtotime($issue_row['Posted']);
}
return array($issue_row, $issue_stamp);
}
</txp:php>
<txp:if_status status="200">
<txp:if_section name="issues">
<txp:php>
global $variable, $pretext;
$date = array(); // Holds the ?month URL param portions
$uri = serverSet('REQUEST_URI');
$qs = serverSet('QUERY_STRING');
$qs = ($qs) ? '?'.$qs : '';
$uri = str_replace($qs, '', $uri);
$uri = do_list($uri, '/');
$pos = array_search('issues', $uri) + 1;
if (isset($uri[$pos])) {
if (is_numeric($uri[$pos])) {
$uri[$pos] = (int) $uri[$pos];
// Anything above 2001 is assumed to be a year. Limits the mag to 2001 issues!
if ($uri[$pos] < 2002) {
$variable['issue'] = $uri[$pos];
} else {
// Year
$date[] = $uri[$pos];
$pos++;
if (isset($uri[$pos]) && is_numeric($uri[$pos])) {
// Month
$date[] = str_pad( (int) $uri[$pos], 2, '0', STR_PAD_LEFT);
$pos++;
if (isset($uri[$pos]) && is_numeric($uri[$pos])) {
// Day
$date[] = str_pad( (int) $uri[$pos], 2, '0', STR_PAD_LEFT);
}
}
// Fake Txp's month filter
$pretext['month'] = join('-', $date);
}
}
} else {
$variable['issue'] = 0;
}
$variable['is_issue_landing'] = ($variable['issue']) ? '1' : '';
</txp:php>
<txp:else />
<txp:if_individual_article>
<txp:if_custom_field name="issue">
<txp:variable name="issue"><txp:custom_field name="issue" /></txp:variable>
</txp:if_custom_field>
</txp:if_individual_article>
</txp:if_section>
</txp:if_status>
<txp:hide>
==========
No issue found: get latest Issue CF from latest article
==========
</txp:hide>
<txp:if_variable name="issue" value="0">
<txp:php>
global $variable;
list($issue_row, $issue_stamp) = issue_info();
$variable['issue'] = $issue_row['custom_1'];
</txp:php>
</txp:if_variable>
<txp:hide>
==========
Create the Month/Year of Issue
==========
</txp:hide>
<txp:php>
global $variable;
list($issue_row, $issue_stamp) = issue_info($variable['issue']); // In case it's not been set up already
$when = ($issue_stamp) ? $issue_stamp : time();
$variable['issue_month'] = date('M', $when);
$variable['issue_year'] = date('Y', $when);
</txp:php>
The php is beyond me, but I’m guessing by looks of keywords, this is where the magic happens for filling things like: <txp:variable name="issue" />, etc.
So my question at this point is just this: If I’m not trying to mimic the past issues links just yet… If all I want right now is the ability to create the mag’s home page list of article in the current issue… What pieces of the puzzle do I need to replicate that in my own project?
I think that would be a good start, combined with the bit from etc at head of this thread for the year count.
#8 Re: General discussions » 9 of the Best Blogging Platforms for 2018 » 2018-11-01 20:09:47
- Destry
towndock wrote #314852:
But these are not truly cultivated news stories. This is click bait – pure and simple. Which of course we are sucking into
Content marketing 101. Working like a charm. It’s all about keywords in the right topic and domain. Draws ‘em like stacks of money in a clear plastic sack.
mericson wrote #314305:
Can you suggest any patches or workarounds that would allow me to get my sight upgraded?
It would be ace if you could try to
- check if
versionpref intxp_prefstable is still4.5.7 - replace the content of
textpattern/update/_to_4.6.0.phpfile with
<?php
/*
* Textpattern Content Management System
* https://textpattern.com/
*
* Copyright (C) 2018 The Textpattern Development Team
*
* This file is part of Textpattern.
*
* Textpattern is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, version 2.
*
* Textpattern is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Textpattern. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('TXP_UPDATE')) {
exit("Nothing here. You can't access this file directly.");
}
// Remove default zero dates to make MySQL 5.7 happy.
safe_alter('textpattern', "MODIFY Posted DATETIME NOT NULL,
MODIFY Expires DATETIME NULL DEFAULT NULL,
MODIFY LastMod DATETIME NOT NULL,
MODIFY feed_time DATE NOT NULL"); //0000-00-00
safe_alter('txp_discuss', "MODIFY posted DATETIME NOT NULL");
safe_alter('txp_discuss_nonce', "MODIFY issue_time DATETIME NOT NULL");
safe_alter('txp_file', "MODIFY created DATETIME NOT NULL,
MODIFY modified DATETIME NOT NULL");
safe_alter('txp_image', "MODIFY date DATETIME NOT NULL");
safe_alter('txp_link', "MODIFY date DATETIME NOT NULL");
safe_alter('txp_log', "MODIFY time DATETIME NOT NULL");
safe_alter('txp_users', "MODIFY last_access DATETIME NULL DEFAULT NULL");
// Remove logs and nonces with zero dates.
safe_delete('txp_discuss_nonce', "DATE(issue_time) = '0000-00-00'");
safe_delete('txp_log', "DATE(time) = '0000-00-00'");
// Replace zero dates (which shouldn't exist, really) with somewhat sensible values.
safe_update('textpattern', "Posted = NOW()", "DATE(Posted) = '0000-00-00'");
safe_update('textpattern', "Expires = NULL", "DATE(Expires) = '0000-00-00'");
safe_update('textpattern', "LastMod = Posted", "DATE(LastMod) = '0000-00-00'");
safe_update('txp_discuss', "posted = NOW()", "DATE(posted) = '0000-00-00'");
safe_update('txp_file', "created = NOW()", "DATE(created) = '0000-00-00'");
safe_update('txp_file', "modified = created", "DATE(modified) = '0000-00-00'");
safe_update('txp_image', "date = NOW()", "DATE(date) = '0000-00-00'");
safe_update('txp_link', "date = NOW()", "DATE(date) = '0000-00-00'");
safe_update('txp_users', "last_access = NULL", "DATE(last_access) = '0000-00-00'");
safe_update('textpattern', "feed_time = DATE(Posted)", "feed_time = '0000-00-00'");
safe_alter('textpattern', "MODIFY textile_body VARCHAR(32) NOT NULL DEFAULT '1'");
safe_alter('textpattern', "MODIFY textile_excerpt VARCHAR(32) NOT NULL DEFAULT '1'");
safe_update('txp_prefs', "name = 'pane_article_textfilter_help_visible'", "name = 'pane_article_textile_help_visible'");
// Rejig preferences panel.
$core_ev = join(',', quote_list(array('site', 'admin', 'publish', 'feeds', 'custom', 'comments')));
// 1) Increase event column size.
safe_alter('txp_prefs', "MODIFY event VARCHAR(255) NOT NULL DEFAULT 'publish'");
safe_alter('txp_prefs', "MODIFY html VARCHAR(255) NOT NULL DEFAULT 'text_input'");
// 2) Remove basic/advanced distinction.
safe_update('txp_prefs', "type = '".PREF_CORE."'", "type = '".PREF_PLUGIN."' AND event IN ($core_ev)");
// Support for l10n string owners.
$cols = getThings("DESCRIBE `".PFX."txp_lang`");
if (!in_array('owner', $cols)) {
safe_alter('txp_lang', "ADD owner VARCHAR(64) NOT NULL DEFAULT '' AFTER event");
safe_create_index('txp_lang', 'owner', 'owner');
}
// Keep all comment-related forms together. The loss of 'preview' ability on the
// comments_display Form is of little consequence compared with the benefit of
// tucking them away neatly when not required.
safe_update('txp_form', "type = 'comment'", "name = 'comments_display'");
// Add protocol to logged HTTP referrers.
safe_update(
'txp_log',
"refer = CONCAT('http://', refer)",
"refer != '' AND refer NOT LIKE 'http://%' AND refer NOT LIKE 'https://%'"
);
// Usernames can be 64 characters long at most.
safe_alter('txp_file', "MODIFY author VARCHAR(64) NOT NULL DEFAULT ''");
safe_alter('txp_link', "MODIFY author VARCHAR(64) NOT NULL DEFAULT ''");
safe_alter('txp_image', "MODIFY author VARCHAR(64) NOT NULL DEFAULT ''");
// Consistent name length limitations for presentation items.
safe_alter('txp_form', "MODIFY name VARCHAR(255) NOT NULL DEFAULT ''");
safe_alter('txp_page', "MODIFY name VARCHAR(255) NOT NULL DEFAULT ''");
safe_alter('txp_section', "MODIFY page VARCHAR(255) NOT NULL DEFAULT ''");
safe_alter('txp_section', "MODIFY css VARCHAR(255) NOT NULL DEFAULT ''");
// Save sections correctly in articles.
safe_alter('textpattern', "MODIFY Section VARCHAR(255) NOT NULL DEFAULT ''");
safe_alter('txp_section', "MODIFY name VARCHAR(255) NOT NULL DEFAULT ''");
// Plugins can have longer version numbers.
safe_alter('txp_plugin', "MODIFY version VARCHAR(255) NOT NULL DEFAULT '1.0'");
// Translation strings should allow more than 255 characters.
safe_alter('txp_lang', "MODIFY data TEXT");
// Add meta description to articles.
$cols = getThings("DESCRIBE `".PFX."textpattern`");
if (!in_array('description', $cols)) {
safe_alter('textpattern', "ADD description VARCHAR(255) NOT NULL DEFAULT '' AFTER Keywords");
}
// Add meta description to categories.
$cols = getThings("DESCRIBE `".PFX."txp_category`");
if (!in_array('description', $cols)) {
safe_alter('txp_category', "ADD description VARCHAR(255) NOT NULL DEFAULT '' AFTER title");
}
// Add meta description to sections.
$cols = getThings("DESCRIBE `".PFX."txp_section`");
if (!in_array('description', $cols)) {
safe_alter('txp_section', "ADD description VARCHAR(255) NOT NULL DEFAULT '' AFTER css");
}
// Remove broken import functionality.
if (is_writable(txpath.DS.'include') && file_exists(txpath.DS.'include'.DS.'txp_import.php')) {
$import_files = array(
'BloggerImportTemplate.txt',
'import_blogger.php',
'import_mt.php',
'import_b2.php',
'import_mtdb.php',
'import_wp.php'
);
if (is_writable(txpath.DS.'include'.DS.'import')) {
foreach ($import_files as $file) {
if (file_exists(txpath.DS.'include'.DS.'import'.DS.$file)) {
unlink(txpath.DS.'include'.DS.'import'.DS.$file);
}
}
rmdir(txpath.DS.'include'.DS.'import');
}
unlink(txpath.DS.'include'.DS.'txp_import.php');
}
// Remove unused ipban table or recreate its index (for future utf8mb4 conversion).
if (getThing("SHOW TABLES LIKE '".PFX."txp_discuss_ipban'")) {
if (!safe_count('txp_discuss_ipban', "1 = 1")) {
safe_drop('txp_discuss_ipban');
} else {
safe_drop_index('txp_discuss_ipban', "PRIMARY");
safe_alter('txp_discuss_ipban', "ADD PRIMARY KEY (ip(250))");
}
}
// Recreate indexes with smaller key sizes to allow future conversion to charset utf8mb4.
safe_drop_index('txp_css', "name");
safe_drop_index('txp_file', "filename");
safe_drop_index('txp_form', "PRIMARY");
safe_drop_index('txp_page', "PRIMARY");
safe_drop_index('txp_section', "PRIMARY");
safe_drop_index('txp_prefs', "name");
safe_drop_index('textpattern', "section_status_idx");
safe_drop_index('textpattern', "url_title_idx");
// Not using safe_create_index here, because we just dropped the index.
safe_alter('txp_css', "ADD UNIQUE name (name(250))");
safe_alter('txp_file', "ADD UNIQUE filename (filename(250))");
safe_alter('txp_form', "ADD PRIMARY KEY (name(250))");
safe_alter('txp_page', "ADD PRIMARY KEY (name(250))");
safe_alter('txp_section', "ADD PRIMARY KEY (name(250))");
safe_alter('txp_prefs', "ADD INDEX name (name(250))");
safe_alter('textpattern', "ADD INDEX section_status_idx (Section(249), Status)");
safe_alter('textpattern', "ADD INDEX url_title_idx (url_title(250))");
// Specifically, txp_discuss_nonce didn't have a primary key in 4.0.3
// so it has to be done in two separate steps.
safe_drop_index('txp_discuss_nonce', "PRIMARY");
safe_alter('txp_discuss_nonce', "ADD PRIMARY KEY (nonce(250))");
// Enforce some table changes that happened after 4.0.3 but weren't part of
// update scripts until now.
safe_alter('txp_css', "MODIFY name VARCHAR(255) NOT NULL");
safe_alter('txp_lang', "MODIFY lang VARCHAR(16) NOT NULL");
safe_alter('txp_lang', "MODIFY name VARCHAR(64) NOT NULL");
safe_alter('txp_lang', "MODIFY event VARCHAR(64) NOT NULL");
safe_drop_index('txp_form', "name");
safe_drop_index('txp_page', "name");
safe_drop_index('txp_plugin', "name_2");
safe_drop_index('txp_section', "name");
// The txp_priv table was created for version 1.0, but never used nor created in
// later versions.
safe_drop('txp_priv');
// Remove empty update files.
if (is_writable(txpath.DS.'update')) {
foreach (array('4.4.0', '4.4.1') as $v) {
$file = txpath.DS.'update'.DS.'_to_'.$v.'.php';
if (file_exists($file)) {
unlink($file);
}
}
}
// Remove unnecessary licence files that have been moved to root.
if (is_writable(txpath)) {
foreach (array('license', 'lgpl-2.1') as $v) {
$file = txpath.DS.$v.'.txt';
if (file_exists($file)) {
unlink($file);
}
}
}
// Add generic token table (dropping first, because of changes to the table setup).
safe_drop('txp_token');
safe_create('txp_token', "
id INT NOT NULL AUTO_INCREMENT,
reference_id INT NOT NULL,
type VARCHAR(255) NOT NULL,
selector VARCHAR(12) NOT NULL DEFAULT '',
token VARCHAR(255) NOT NULL,
expires DATETIME NULL DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE INDEX ref_type (reference_id, type(50))
");
// Category names are max 64 characters when created/edited, so don't pretend
// they can be longer.
safe_alter('textpattern', "MODIFY Category1 VARCHAR(64) NOT NULL DEFAULT ''");
safe_alter('textpattern', "MODIFY Category2 VARCHAR(64) NOT NULL DEFAULT ''");
safe_alter('txp_file', "MODIFY category VARCHAR(64) NOT NULL DEFAULT ''");
safe_alter('txp_image', "MODIFY category VARCHAR(64) NOT NULL DEFAULT ''");
// Farewell Classic and Remora themes.
$availableThemes = \Textpattern\Admin\Theme::names();
if (!in_array(get_pref('theme_name'), $availableThemes)) {
set_pref('theme_name', 'hive');
}
No guarantee that it works, but a negative result is still a result.
#10 Re: Troubleshooting » txplib_misc.php Funny stuff » 2018-09-15 22:15:44
- colin99
uli wrote #314043:
Colin, do you still have messages at hand or can name the behaviour of your installation at the time the issue happened so users can search the forum for some keywords and this topic turns up? Thanks!
Yes.
I deliberately set txplib_misc.php to CHMOD 000 to re-create the fault.
Warning: include(/home/——/public_html/123/textpattern/lib/txplib_misc.php): failed to open stream: Permission denied in /home/——/public_html/123/index.php on line 92
Warning: include(): Failed opening ‘/home/——/public_html/123/textpattern/lib/txplib_misc.php’ for inclusion (include_path=’.:/opt/alt/php72/usr/share/pear’) in /home/——/public_html/123/index.php on line 92
Fatal error: Uncaught Error: Call to undefined function assert_int() in /home/——/public_html/123/textpattern/lib/class.trace.php:72 Stack trace: #0 /home/——-/public_html/123/index.php(93): Trace->stop() #1 {main} thrown in /home/——/public_html/123/textpattern/lib/class.trace.php on line 72